2013-03-30 2 views
1

Хорошо, я протестировал путь ниже.True random is not true random Я действительно смущен

Сгенерировано x раз в случайных числах между 0~x и затем проверяется те, которые не были сгенерированы.

Я бы предположил, что это будет очень близко к 100%. Я имею в виду все числа между 0~x.

Но результаты шокируют. О 36% с номерами отсутствует.

Является ли моя случайная функция не случайной?

Здесь ниже моего случайного класса:

private static Random seedGenerator = new Random(); 

private static ThreadLocal<Random> random = 
    new ThreadLocal<Random>(SeededRandomFactory); 

private static Random SeededRandomFactory() 
{ 
    lock (seedGenerator) 
     return new Random(seedGenerator.Next()); 
} 

public static int GenerateRandomValueMin(int irRandValRange, int irMinValue) 
{ 
    return random.Value.Next(irMinValue, irMinValue + irRandValRange); 
} 

Здесь результаты ниже:

 
Between 0-10, missing numbers count: 4, percent: 40% 
Between 0-100, missing numbers count: 36, percent: 36% 
Between 0-1000, missing numbers count: 369, percent: 36,9% 
Between 0-10000, missing numbers count: 3674, percent: 36,74% 
Between 0-100000, missing numbers count: 36583, percent: 36,58% 
Between 0-1000000, missing numbers count: 367900, percent: 36,79% 
Between 0-10000000, missing numbers count: 3678122, percent: 36,78% 
Between 0-100000000, missing numbers count: 36797477, percent: 36,8% 

Вот код, как я просматриваю:

File.WriteAllText("results.txt", ""); 

int irFirst = 10; 

for (int i = 0; i < 8; i++) 
{ 
    HashSet<int> hsGenerated = new HashSet<int>(); 

    for (int k = 0; k < irFirst; k++) 
    { 
     hsGenerated.Add(GenerateRandomValue.GenerateRandomValueMin(irFirst, 0)); 
    } 

    int irNotFound = 0; 
    for (int k = 0; k < irFirst; k++) 
    { 
     if (hsGenerated.Contains(k) == false) 
      irNotFound++; 
    } 

    string srSonuc = 
     string.Format(
      "Between 0-{0}, missing numbers count: {1}, percent: {2}%", 
      irFirst, irNotFound, 
      Math.Round((Convert.ToDouble(irNotFound)/Convert.ToDouble(irFirst))*100.0, 2).ToString() 
      ); 

    using (StreamWriter w = File.AppendText("sonuclar.txt")) 
    { 
     w.WriteLine(srSonuc); 
    } 

    irFirst = irFirst * 10; 
} 
+0

Не могли бы вы добавить код, который вы используете для измерения недостающих чисел? – svick

+0

@svick уверен, добавленный весь код – MonsterMMORPG

+0

Является ли «случайным» для вас равноценным значением вывода? – Patrick

ответ

13

Как указано в комментариях, ваш метод тестирования отключен.

Вы рисуете x раз число от 0 до x. Вероятность того, что конкретное число не обращено это:

((x-1)/x)^x

В х стремится к бесконечности, р будет идти к 1/е И это число, которое вы видите в (или около 36,7879441%). ваши результаты. Кроме того, поскольку x приближается к бесконечности, вы будете наблюдать эту вероятность как результат вашего образца (Закон больших чисел)

Это связано с вероятностью. Когда у вас есть миска с красным и белым мрамором. И вы берете один, положите его обратно, возьмите еще один, который вы не может гарантировать, что вы видите оба. Вы можете взять красный дважды. Вы делаете то же самое с большим количеством объектов.


Чтобы уточнить истинный истинную случайность:

Я бы ожидать близко к 99% процентам, а не 64%. Или, по крайней мере, 90% +%. Поэтому вы говорите, что это невозможно в современных технологиях

Это просто. Благодаря современной математике, технологиям и моим сверхспособностям я могу рассказать вам, как это сделать: вам нужно больше ничьих, чем числа на выбор. Формула приобретает следующий вид:

more math

где п вам желаемый процент отсутствующих номеров. Например, если вы готовы принять 5% отсутствующих номеров, вы должны сделать в три раза больше случайных чисел. Для 1% вероятности вам нужно итерации в 4,6 раза больше максимального числа.

Эта математика предполагает совершенно однородное генерирование случайных чисел.

+3

Это не математическое развлечение? :-) – Patrick

+0

есть. Я понял причину. причина в том, что компьютеры основаны на математике, так что все еще невозможно генерировать истинные случайные – MonsterMMORPG

+1

@MonsterMMORPG: Это не _, потому что компьютеры не генерируют по-настоящему случайные числа. Даже если вы бросите идеальный кубик 6 раз, вам не гарантировано получить 6 разных чисел. Это случайное поведение в случайности. – Rune

-1

Если вы хотите 100 миллионов уникальных случайных номер можно сделать примерно так:

Теперь с помощью Fisher-Yates алгоритма Суффля:

List<int> numbers = new List<int>(100000000); 
for (int i = 0; i < numbers.Capacity; i++) 
{ 
    int rnd = random.Next(numbers.Count + 1); 
    if (rnd == numbers.Count) 
     numbers.Add(i); 
    else 
    { 
     numbers.Add(numbers[rnd]); 
     numbers[rnd] = i; 
    } 
} 

Кстати, вы могли бы вычислить irNotFound гораздо быстрее:

int irNotFound = irFirst - hsGenerated.Count; 

Удачи с вашими поисками.

+0

спасибо, но это то, что я имел в виду. Я генерирую новое случайное число, но вижу, что он действительно не распространяется. – MonsterMMORPG

+0

Этот код генерирует не так-случайную * перестановку *. «равномерное распределение» - неправильный термин здесь; равномерное распределение не обеспечивало бы, чтобы каждое число происходило ровно один раз. – Daniel

+0

Ну, я попробую ваше решение. Если лучше, это улучшит мою функцию для определенной вещи ^^ – MonsterMMORPG

5

Ваши результаты - именно то, что следует ожидать от равномерного распределения, где вы образец с заменой.

Рассмотрите простейший возможный пример. У вас есть монета и бросьте ее дважды. Поэтому мы предполагаем, что мы взяли выборку из равномерного дискретного распределения.

Возможные результаты, которые происходят с равной вероятностью 0,25 являются:

TT 
TH 
HT 
HH 

Как вы можете видеть, только два из четырех результатов у обоих головы и хвосты.

Это известно как выборка с заменой. Итак, как только мы пробовали хвосты, мы «вернем его в сумку», и он может снова выйти на следующий образец.

Теперь предположим, что мы пробоем без замены. В этом случае возможны два возможных результата:

TH 
HT 

И как вы видите, каждое возможное значение появляется ровно один раз.

По существу, ваше ожидание результатов неверно. В качестве другого примера предположим, что вы бросаете монету, и она падает вниз. Что вы ожидаете, произойдет при следующем броске. Вы утверждаете, что монета должна теперь спуститься вниз. Но это явно бессмыслица.


Если вы действительно хотели попробовать без замены, и не ясно, что это на самом деле то, что вы хотите, то вы делаете это с Fisher-Yates shuffle.

+0

, так что вы говорите, что ожидается 36%? ну, я бы ожидал от истинного случайного близкого к 100% распределения – MonsterMMORPG

+4

Ваши ожидания верны. –

+0

Я вижу.Компьютеры - это не что иное, как математика, поэтому кажется, что истинное случайное все еще невозможно. – MonsterMMORPG