Понимание "случайности" - PullRequest
       133

Понимание "случайности"

828 голосов
/ 18 октября 2010

Я не могу разобраться с этим, что является более случайным?

rand()

ИЛИ

rand() * rand()

Я считаю, что это настоящая головоломка для мозга, не могли бы вы помочь?меня?

РЕДАКТИРОВАТЬ:

Интуитивно я знаю, что математическим ответом будет то, что они одинаково случайны, но я не могу не думать, что если вы "Запустите алгоритм случайных чисел "дважды, когда вы умножите их вдвоем, вы создадите нечто более случайное, чем просто один раз.

Ответы [ 28 ]

1 голос
/ 15 января 2016

На самом деле, когда вы думаете об этом, rand() * rand() является меньше случайным, чем rand().Вот почему.

По существу, число нечетных чисел равно количеству четных чисел.И говоря, что 0,04325 является нечетным, а 0,388 четным, а 0,4 четным и 0,15 нечетным,

Это означает, что rand() имеет равный равный шанс быть четным или нечетным десятичным знаком .

С другой стороны, у rand() * rand() шансы сложены несколько иначе.Скажем:

double a = rand();
double b = rand();
double c = a * b;

a и b оба имеют 50% вероятности того, что они будут четными или нечетными.Зная, что

  • четные * четные = четные
  • четные * нечетные = четные
  • нечетные * нечетные = нечетные
  • нечетные * четные = четные

означает, что есть 75% -ый шанс , что c является четным, в то время как только 25% -ый шанс это нечетно, делая значение rand() * rand()более предсказуемо, чем rand(), поэтому менее случайно.

1 голос
/ 25 мая 2012

Мы можем сравнить два массива чисел относительно случайности, используя Колмогоровская сложность Если последовательность чисел не может быть сжата, то она является самой случайной, которую мы можем достичь при такой длине ... Я знаю, что этот тип измерения является более теоретическим вариантом ...

0 голосов
/ 15 мая 2018

Предполагая, что rand() возвращает число от [0, 1), очевидно, что rand() * rand() будет смещено в сторону 0. Это потому, что умножение x на число между [0, 1) приведет к числу, меньшему x. Вот распределение 10000 больше случайных чисел:

google.charts.load("current", { packages: ["corechart"] });
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
  var i;
  var randomNumbers = [];
  for (i = 0; i < 10000; i++) {
    randomNumbers.push(Math.random() * Math.random());
  }
  var chart = new google.visualization.Histogram(document.getElementById("chart-1"));
  var data = new google.visualization.DataTable();
  data.addColumn("number", "Value");
  randomNumbers.forEach(function(randomNumber) {
    data.addRow([randomNumber]);
  });
  chart.draw(data, {
    title: randomNumbers.length + " rand() * rand() values between [0, 1)",
    legend: { position: "none" }
  });
}
<script src="https://www.gstatic.com/charts/loader.js"></script>

<div id="chart-1" style="height: 500px">Generating chart...</div>

Если rand() возвращает целое число от [x, y], то у вас есть следующее распределение. Обратите внимание на количество нечетных и четных значений:

google.charts.load("current", { packages: ["corechart"] });
google.charts.setOnLoadCallback(drawChart);
document.querySelector("#draw-chart").addEventListener("click", drawChart);

function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function drawChart() {
  var min = Number(document.querySelector("#rand-min").value);
  var max = Number(document.querySelector("#rand-max").value);
  if (min >= max) {
    return;
  }
  var i;
  var randomNumbers = [];
  for (i = 0; i < 10000; i++) {
    randomNumbers.push(randomInt(min, max) * randomInt(min, max));
  }
  var chart = new google.visualization.Histogram(document.getElementById("chart-1"));
  var data = new google.visualization.DataTable();
  data.addColumn("number", "Value");
  randomNumbers.forEach(function(randomNumber) {
    data.addRow([randomNumber]);
  });
  chart.draw(data, {
    title: randomNumbers.length + " rand() * rand() values between [" + min + ", " + max + "]",
    legend: { position: "none" },
    histogram: { bucketSize: 1 }
  });
}
<script src="https://www.gstatic.com/charts/loader.js"></script>

<input type="number" id="rand-min" value="0" min="0" max="10">
<input type="number" id="rand-max" value="9" min="0" max="10">
<input type="button" id="draw-chart" value="Apply">

<div id="chart-1" style="height: 500px">Generating chart...</div>
0 голосов
/ 18 мая 2013

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

Именно поэтому я настоятельно рекомендую вам потратить некоторое время и прочитать этот сайт, чтобы лучше понять случайность:

Вернемся к настоящему вопросу. В этом термине нет более или менее случайного:

оба выглядят случайными !

В обоих случаях - просто rand () или rand () * rand () - ситуация одна и та же: После нескольких миллиардов чисел последовательность будет повторяться (!) . Это кажется случайным для наблюдателя, потому что он не знает всей последовательности, но у компьютера нет истинного случайного источника - поэтому он также не может производить случайность .

например: погода случайная? У нас недостаточно сенсоров или знаний, чтобы определить, случайная погода или нет.

0 голосов
/ 26 сентября 2011

Легко показать, что сумма двух случайных чисел не обязательно случайна. Представьте, что у вас есть 6-ти сторонний кубик. Каждый номер имеет 1/6 шанс появления. Теперь скажите, что у вас было 2 кубика и подвели итоги. Распределение этих сумм не 1/12. Зачем? Потому что одни цифры появляются больше, чем другие. Существует несколько разделов из них. Например, число 2 - это сумма только 1 + 1, но 7 может быть образовано 3 + 4 или 4 + 3 или 5 + 2 и т. Д., Поэтому у него больше шансов на успех.

Следовательно, применение преобразования, в этом случае добавление к случайной функции, не делает ее более случайной или обязательно сохраняет случайность. В случае вышеприведенных кубиков распределение искажено до 7 и, следовательно, менее случайное.

0 голосов
/ 02 июня 2011

Используйте регистр сдвига с линейной обратной связью (LFSR), который реализует примитивный полином.

Результатом будет последовательность из 2 ^ n псевдослучайных чисел, т.е. ни одно из них не повторяется в последовательности, где n - это числобитов в LFSR ...., что приводит к равномерному распределению.

http://en.wikipedia.org/wiki/Linear_feedback_shift_register http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

Используйте "случайное" начальное число на основе микросекунд часов вашего компьютера или, возможно, подмножестворезультата md5 для некоторых постоянно изменяющихся данных в вашей файловой системе.

Например, 32-битный LFSR сгенерирует 2 ^ 32 уникальных числа в последовательности (без 2 одинаковых), начиная с заданного начального числа.Последовательность всегда будет в том же порядке, но отправная точка будет отличаться (очевидно) для разных семян.Итак, если возможно повторяющаяся последовательность между начальными значениями не является проблемой, это может быть хорошим выбором.

Я использовал 128-битные LFSR для генерации случайных тестов в аппаратных симуляторах с использованием начального числа, которое является результатами md5при постоянно меняющихся системных данных.

0 голосов
/ 02 июня 2011

ОК, поэтому я попытаюсь добавить некоторые значения, чтобы дополнить ответы других, сказав, что вы создаете и используете генератор случайных чисел.

Генераторы случайных чисел - это устройства (в очень общем смысле), которые имеют несколько характеристик, которые могут быть изменены для соответствия цели. Некоторые из них (от меня):

  • Энтропия: как в Энтропии Шеннона
  • Распределение: статистическое распределение (пуассоновское, нормальное и т. Д.)
  • Тип: что является источником чисел (алгоритм, естественное событие, комбинация и т. Д.) И применяемый алгоритм.
  • Эффективность: быстрота или сложность исполнения.
  • Шаблоны: периодичность, последовательности, прогоны и т. Д.
  • и, возможно, больше ...

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

0 голосов
/ 18 октября 2010

Ответ будет, это зависит, надеюсь, что rand () * rand () будет более случайным, чем rand (), но как:

  • оба ответа зависят от размера вашего значения в битах
  • , что в большинстве случаев вы генерируете в зависимости от псевдослучайного алгоритма (который в основном является генератором чисел, который зависит от часов вашего компьютера, а не так много случайных).
  • сделайте ваш код более читабельным (и не вызывайте случайного бога случайного вуду с помощью этой мантры).

Хорошо, если вы проверите что-либо из вышеперечисленного, я предлагаю вам воспользоваться простым "rand ()". Поскольку ваш код был бы более читабельным (не спрашивал бы себя, зачем вы это написали, на ... хорошо ... более 2 секунд), его было бы легко поддерживать (если вы хотите заменить своего ранда) функция с супер_рандом).

Если вам нужен лучший случайный случай, я бы порекомендовал вам передавать его из любого источника, который обеспечивает достаточно шума ( радиостатический ), и тогда простого rand() должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...