는, 숫자를 예측할 수있는 방법이 있어야합니다.
실제로; 당신이 (특히 inext
, inextp
및 SeedArray
에 - 총 그래서 58 개 int
값) 내부 상태를 알고있는 경우, 및 당신은 Next()
, Next()
요구 (예를 들어, 정확한 순서로 요청하고자하는 정확한 작업을 알고 , NextBytes()
은 Next()
, NextBytes()
, Next()
과 매우 다릅니다. 그러면 정확한 정확한 추측을 할 수 있습니다. 그게 전부 포인트 시드 PRNG의 - 반복 가능한 임의성을 허용합니다, 당신이 이벤트를 재생할 수 있어야 할 때 많은 시나리오에서 유용합니다.
그래서 : 나는 당신이 이제까지 원래 씨을 다시 얻을 수 있다고 생각하지 않지만, 미래 (보다는 과거) 당신이 씨앗을하지 않아도을 예측하기 - 당신은 58 int
값이 필요합니다.
그러나! 무작위성이 인 항목이 인 경우 임의의 공급자 무작위 제공자를 사용해야하며 이 아니고은 반복 가능하거나 추측 할 수 있어야합니다.
예를 들어
:
static class Program {
static Random Clone(this Random source)
{
var clone = new Random();
var type = typeof(Random);
var field = type.GetField("inext",
BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(clone, field.GetValue(source));
field = type.GetField("inextp",
BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(clone, field.GetValue(source));
field = type.GetField("SeedArray",
BindingFlags.Instance | BindingFlags.NonPublic);
int[] arr = (int[])field.GetValue(source);
field.SetValue(clone, arr.Clone());
return clone;
}
static void Main()
{
Random rand = new Random();
var clone = rand.Clone();
Console.WriteLine("My predictions:");
Console.WriteLine(clone.Next());
Console.WriteLine(clone.Next());
Console.WriteLine(clone.Next());
Console.WriteLine("Actual:");
Console.WriteLine(rand.Next());
Console.WriteLine(rand.Next());
Console.WriteLine(rand.Next());
}
}
당신은 찾을 수 있습니다 [이 문서] (http://ericlippert.com/2013/05/02/producing-permutations-part-six/)와 [속편] (흥미로운 Eric Lippert의 http://ericlippert.com/2013/05/06/producing-permutations-part-seven/). 그는 당신이하고있는 방식으로 미래를 예측할 것을 사용자들에게 요구했다. 씨앗을 강요하는 것은 특히'Environment.TickCount' 값이 더 많을 때 더 빨리 생각할 수 있습니다. – Brian
고마워요 브라이언! 매우 흥미로운!! 나는 어제를 앞두고 무력을 시도했다. 당신 말이 맞아요, 아주 빠릅니다. 나는 15 개의 숫자 시퀀스를 맞추었고, 10 000 000 개의 시드를 검색 할 때 평균 22.3 초의 시드 숫자를 발견했습니다. 이 결과는 꽤 표준적인 듀얼 코어 노트북에서 나온 것입니다. 이 기사는 매우 흥미 롭습니다. 일부 종자 값이 다른 종자 값보다 가능성이 높습니다. – Corne