2017-12-30 27 views
-1

以下は、私は、変数を宣言するために使用されるコードは次のとおりです。ランダムなデータ型を1つ使用しますが、結果は異なりますか?

Random x= new Random(); 
int xval; 
string xresult; 

xval = x.Next(4); 
string[] xlist = { 
    "ZERO", 
    "ONE", 
    "TWO", 
    "THREE", 
}; 
xresult = xlist[xval]; 

私の問題は、その結果は、私はそれを使用するすべての回で同じであるということです。毎回それを変更したりリセットしたりしたい。

答えて

0

ランダムに使用すると、DateTime.Nowから派生したシードで初期化されます。これを使用して0〜4の数値を生成します(除外されます)。同じ数字を得る時間の25%

using System; 
using System.Collections.Generic; 

public class Program 
{  
    public static void Main() 
    { 
     Random x= new Random(); 

     List<int> ints = new List<int>(); 

     for(int i=0; i< 100; i++) ints.Add(x.Next(4)); 

     Console.WriteLine(string.Join(", ",ints)); 
    } 
} 

出力(再フォーマット):

3, 0, 1, 1, 1, 1, 3, 0, 2, 0, 1, 2, 1, 0, 3, 1, 3, 0, 2, 2, 3, 1, 1, 2, 1, 
2, 3, 3, 2, 3, 3, 2, 0, 3, 3, 3, 0, 0, 3, 0, 2, 1, 3, 3, 1, 0, 2, 1, 3, 0, 
2, 2, 3, 3, 1, 1, 2, 3, 3, 2, 2, 0, 2, 2, 1, 2, 2, 1, 1, 3, 1, 3, 1, 2, 0, 
2, 2, 1, 0, 1, 3, 1, 0, 1, 1, 1, 2, 0, 2, 1, 1, 0, 0, 0, 1, 2, 3, 0, 2, 2 

それは別のものを生成します。あなたはただ運が良かったです。

宣言Random x=new Random()(badname btw)を使用する場所の外側に移動する必要があります。繰り返し作成しないようにしてください。おそらく、あなたの時間に基づいて「異なる」種子のために同様のランを得るでしょう。ランダムに(偶然に)異なるシードランで同じ100桁を持つことができます。ランダムは、異なることを意味するわけではありません。特に、ランダム性をすべてマッピングするために4つの値しか使用しない場合です。

コメントで発言した後 - 異なるランダムシードのために「同じ」開始のシーケンスを示しています

using System; 
using System.Linq; 
using System.Collections.Generic; 

public class Program 
{  

    static IEnumerable<int> FirstNumbersFromSeed(int seed, int num) 
    { 
     var r = new Random(seed); 
     for (int i=0;i<num;i++) 
      yield return r.Next(4); 
    } 

    public static void Main() 
    { 

     Dictionary<string,List<int>> dict = new Dictionary<string,List<int>>(); 

     int num = 5; 
     for (int i =0;i<2000; i++) 
     { 
      var key = string.Join(",",FirstNumbersFromSeed(i,num)); 

      if (dict.ContainsKey(key)) dict[key].Add(i); 
      else dict[key] = new List<int>(i); 
     } 

     foreach(var kvp in dict.Where(d => d.Value.Count > 1)) 
      Console.WriteLine(string.Join(", ",kvp.Key) + " same first " + num + " values for seed with ints: " + string.Join(",",kvp.Value)); 
    } 
} 

出力:

だから、あなたが同じをお届けについて305「衝突」を持っている
2,3,3,2,0 same first 5 values for seed with ints: 239,890 
0,0,1,3,2 same first 5 values for seed with ints: 1463,1576 
3,1,0,3,0 same first 5 values for seed with ints: 540,653,1876 
1,1,1,2,1 same first 5 values for seed with ints: 656,769,895 
<snipped 300 more output lines> 
1,0,1,3,3 same first 5 values for seed with ints: 1862,1988 

0から4(無制限)のランダム値を描画する場合は、0から2000までのシードの「ランダム」値を開始します。

+1

あなたはどのように使用しているかについて前提を設定しています。おそらく彼らは詐欺師に問題を起こしているでしょう。 –

+0

@MartinSmithは、異なるシードを使用し、同じ最初の5つの乱数を順番に生成することで、ランダムから「同じ」シーケンスを表示するコードを追加しました –

0

あなたは自分の配列からランダムな値を抽出したい場合は、次のコードを使用し、それは非常に重要なユニークRandomインスタンスを作成し、それを乱数が必要とされるたびに再利用すること

private static Random s_Random = new Random(); 

public static void Main(string[] args) 
{ 
    String[] xlist = 
    { 
     "ZERO", 
     "ONE", 
     "TWO", 
     "THREE" 
    }; 

    Int32 idx; 

    for (Int32 i = 0; i < 10; ++i) 
    { 
     idx = s_Random.Next(xlist.Length); 
     Console.WriteLine(xlist[idx]); 
    } 
} 

注意を生成された数の均一性を達成するために使用される。

作業デモhereを試すことができます。

関連する問題