2016-08-23 7 views
-2

は、私は、リストからランダムな要素を選択するためにこのコードを使用しています:リストからランダムなエントリを選択するにはどうすればよいですか?

var rand = new Random(); 
var i = rand.Next(words.Count); 
keyword = words[i].keyword; 

これは、これを行うための最適な方法ですか私が採用する可能性がより良い方法はありますか?私が特に心配しているのは、これは完全にランダムなのでしょうか?

+2

ランダムは「完全にランダム」です。 –

+1

ランダムなエントリを選択するたびに、リストの要素のインデックスをランダム化するのはどうですか? – CodeWalker

答えて

2

これは無条件に無作為になります。ではなく、の番号を必要とするたびに新しいRandomインスタンスを作成する必要があります。それはジェネレータの統計的性質を完全に破壊します。

でも、完璧なランダム性は得られません(そのためには外部ハードウェアが必要です)が、ランダム性の主要な性質をすべて満たす必要があります。

+0

"それは発電機の統計的性質を完全に破壊します。"引用が必要です。 – Thilo

+0

デモンストレーションによる証明:繰り返される 'new Random();のx-yプロットを作成します。 x =次へ;あなたが私の意味を持ち、出力をグラフィックで調べるならば、y = Next'。 – Bathsheba

+0

ランダムインスタンスは時間に基づいていますか?タイミングは5-10秒間隔であり、クリックが使用されたときに基づいて、より良いものになるでしょうか? – Alan2

4

複数の乱数を作成する場合は、ランダムインスタンスを保持して再利用する必要があります。 時間が近すぎる新しいインスタンスを作成すると、乱数ジェネレータがシステムクロックからシードされるのと同じ一連の乱数が生成されます。

新しいRandom()を実行するたびに、初期化されます。つまり、タイトなループでは、同じ価値を何度も得ることになります。あなたは単一のランダムインスタンスを保持し、同じインスタンス上で次を使用し続ける必要があります。

0

単一時の初期化のために、この行を入れます。新しい番号を毎回生成するコードの下var rand = new Random();

使用を。

var i = rand.Next(words.Count); 
keyword = words[i].keyword; 

ご希望の場合はお手数ですが、

関連する問題