RNGCryptoServiceProvider nie powiedzie się testowi chi-kwadrat na dużych liczbach losowych
Czy ktoś wie, dlaczego test RNGCryptoServiceProvider kończy się niepowodzeniem testu chi-kwadrat podczas próby uzyskania liczb większych niż 300 000 000.
Próbowałem uzyskać losową liczbę w zakresie 0–1 000 000 000, w wyniku czego otrzymałem nieudany test chi-kwadrat, liczby w zakresie 0–300 000 000 pojawiły się bardziej niż inne liczby.
ostatecznie połączyłem formularz dużej liczby z mniejszymi liczbami (0-99 * 100M + 0-99,999,999) i przebiegiem testu chi-kwadrat.
czy ktoś może wyjaśnić tę anomalię dużymi liczbami?
Użyłem następującego kodu, aby uzyskać liczby
[Timeout(TestTimeout.Infinite), TestMethod]
public void TestMethodStatistic()
{
Dictionary<long, long> appearances = new Dictionary<long, long>();
UInt64 tenBillion = 10000000000;
for (UInt64 i = 0; i < 10000000; i++)
{
UInt64 random = GetSIngleRandomNumberInternal() % tenBillion;
UInt64 bucket = random /10000000;
if (!appearances.ContainsKey(Convert.ToInt64(bucket)))
{
appearances.Add(Convert.ToInt64(bucket), 0);
}
appearances[Convert.ToInt64(bucket)]++;
}
string results = "\nBucket Id\tcount\n";
foreach (var appearance in appearances)
{
results += appearance.Key+"\t"+ appearance.Value +"\n";
}
File.AppendAllText(@"C:\Result.txt",results);
}
private RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
private UInt64 GetSIngleRandomNumberInternal()
{
byte[] randomNumBytes = new byte[sizeof(UInt64)];
rngCsp.GetBytes(randomNumBytes);
return BitConverter.ToUInt64(randomNumBytes, 0);
}
Weź plik Result.txt i skopiuj zawartość do programu Excel. uczyń z niej tabelę i dodaj 2 kolumny 1 to oczekiwany wynik o wartości 100000, a drugi to test Chi-kwadrat wartość to „= CHISQ.TEST ([count], [[expected]])”
gdy wartość testu chi-kwadrat jest mniejsza niż 0,1, mamy problem.