2017-02-24 5 views
1

ランダム変数を1回だけ初期化しようとしていますが、 'rnd'としましょう。だから私のプログラムの多くのポイントから呼び出された場合、ランダム変数は初回のみ、再び初期化されません。C#:シングルトンパターンでランダム()を1回だけ初期化する

私はシングルトンを作成しましたが、Random()を1回だけ呼び出す方法はわかりません。このクラス内の

public sealed class Randomize 
{ 
    private static Randomize instance = null; 
    private static readonly object padlock = new object(); 

    Randomize() 
    { 
    } 
    public static Randomize Instance 
    { 
     get 
     { 
      lock (padlock) 
      { 
       if (instance == null) 
       { 
        instance = new Randomize(); 
       } 
       return instance; 
      } 
     } 
    } 
} 

私に、一度だけ初期化されているプラ​​イベート読み取り専用ランダム変数、「RND」、最初の時間を作成したいと思います。そこで、私はしたいと思います

Random rnd = new Random() 

それは初回のみが割り当てられているので、私はその値を変更できるようにしたくないので、私は唯一のプロパティは読み取り専用になりたい

 public Random Rnd 
     { 
      get { return rnd; } 
     } 

を(取得)、ではない:例えば、その値を読み込むためのプロパティを作成セット。私のプログラムの多くのポイントからそう

私が行うことができます。

private readonly Random rnd; 
Random rnd = Randomize.Instance.Rnd; 

しかし、私は表現の上に使用してそれを呼び出すたびに、私は(新しいランダム()を実行して)再び確率変数をinitizalizeしたくない代わりに、I rnd変数が最初に初期化されたのと同じ値を常に取得したい。

どのようにすればいいですか?

+3

「ランダム」は、複数のスレッドから同時に操作するようには設計されていません。 – Servy

+1

Skeetの[シングルトンに関する記事](http://csharpindepth.com/Articles/General/Singleton.aspx)を見てください。 –

+0

何がうまくいかないのですか? 'new Random()'はどこですか? –

答えて

2

ただ、一度だけ

MSDNドキュメント国と呼ばれることにgaurenteedされ、定義により、静的コンストラクタを使用します。静的コンストラクタは任意の静的データを初期化するために使用される、または実行するために

一度だけ実行する必要がある特定のアクション。最初のインスタンスが作成される前に自動的に呼び出されるか、静的メンバーが参照されます。

public sealed class Randomize 
{ 
    private static Randomize instance = null; 
    private static readonly object padlock = new object(); 

    public Random GetRandom { get { return rnd; } }   

    private static readonly Random rnd; 

    static Randomize() 
    { 
     rnd = new Random(); 
    } 
} 
+0

ここでは、プログラムのさまざまな点からランダムに複数回呼び出すことができます。また、ランダムの新しいインスタンスが取得されるたびに呼び出すことができます。私はRandom()を一度だけ初期化し、次回は初期化したくないので、初めて初期化されたRandom()を取得するだけです。 – user1624552

+0

@ user1624552いいえrandomizeクラスの静的コンストラクターは、いったん通常のコンストラクターでない場合にのみ初期化されます。 –

+0

[MSDN](https://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx)を参照してください。ドキュメント ' –

0

読み取り専用の変数は、コンストラクタに割り当てることができますので、私はそのルートを行くだろう。

public sealed class Randomize { 
    /* access level here */ Random rnd { get { return r; } } 
    private readonly Random r; 

    static Randomize() { 
     r = new Random(); 
    } 
} 

// or 

     private readonly Random r = new Random(); 
     public Random rnd { 
      get { 
       return r; 
      } 
     } 
0

次のスニペットでRandomize.Randomにアクセスすることができ、それは常に、一度初期化Random rndフィールドを返します。

public sealed class Randomize { 
    private static readonly Random rnd = new Random(); 
    public static Random Random { 
     get { 
      return rnd; 
     } 
    } 
} 
関連する問題