2017-12-30 46 views
-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을 사용해 볼 수 있습니다.