PHP - Рэнд (1,1000) = 1000 столь же вероятен как рэнд (1,1000) = рэнд (1,1000)?

Существует две главных цели хеш-функций:

  • для рассеивания точек данных однородно в n биты.
  • для безопасной идентификации входных данных.

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

, Если Вы просто делаете хеш-таблицу в программе, затем Вы не должны волноваться о том, насколько обратимый или hackable алгоритм... SHA-1 или AES являются абсолютно ненужными для этого, Вы были бы более обеспеченным использованием изменение FNV. FNV достигает лучшей дисперсии (и таким образом меньше коллизий), чем простая главная модификация как Вы упомянутый, и это более адаптируемо к переменным входным размерам.

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

7
задан Ropstah 16 August 2009 в 15:13
поделиться

7 ответов

Пусть данные говорят сами за себя.

Код

vinko@parrot:~$ more rand.php
<?php

$randrandsum = 0;
$randconstsum = 0;
$count = 20;
for ($j = 0; $j < $count; $j++) {
        $randrand = 0;
        $randconst = 0;
        for ($i = 0; $i < 10000000; $i++ ){
                $a = rand(1,1000);
                $b = rand(1,1000);
                if ($a == $b) $randrand++;
        }
        for ($i = 0; $i < 10000000; $i++ ){
                $a = rand(1,1000);
                $c = 1000;
                if ($c == $a) $randconst++;
        }
        $randrandsum += $randrand;
        $randconstsum += $randconst;
        print ($j+1)." RAND-RAND: $randrand RAND-CONST: $randconst\n";
}
print "AVG RAND-RAND: ".($randrandsum/$count);
print " AVG RAND-CONST: ".($randconstsum/$count)."\n";
?>

Тестовый прогон

vinko@parrot:~$ php rand.php
1 RAND-RAND: 10043 RAND-CONST: 10018
2 RAND-RAND: 9940 RAND-CONST: 10132
3 RAND-RAND: 9879 RAND-CONST: 10042
4 RAND-RAND: 9878 RAND-CONST: 9965
5 RAND-RAND: 10226 RAND-CONST: 9867
6 RAND-RAND: 9866 RAND-CONST: 9992
7 RAND-RAND: 10069 RAND-CONST: 9953
8 RAND-RAND: 9967 RAND-CONST: 9862
9 RAND-RAND: 10009 RAND-CONST: 10060
10 RAND-RAND: 9809 RAND-CONST: 9985
11 RAND-RAND: 9939 RAND-CONST: 10057
12 RAND-RAND: 9945 RAND-CONST: 10013
13 RAND-RAND: 10090 RAND-CONST: 9936
14 RAND-RAND: 10000 RAND-CONST: 9867
15 RAND-RAND: 10055 RAND-CONST: 10088
16 RAND-RAND: 10129 RAND-CONST: 9875
17 RAND-RAND: 9846 RAND-CONST: 10056
18 RAND-RAND: 9961 RAND-CONST: 9930
19 RAND-RAND: 10063 RAND-CONST: 10001
20 RAND-RAND: 10047 RAND-CONST: 10037
AVG RAND-RAND: 9988.05 AVG RAND-CONST: 9986.8

Учитывая приведенные выше результаты, я бы сказал, что для всех практических целей оба варианта эквивалентны, давая ожидаемый результат 1/1000 в обоих случаях.

11
ответ дан 6 December 2019 в 08:44
поделиться

Да, rand (1,1000) = 1000 так же вероятно, как rand (1,1000) = rand (1,1000).

Представьте себе бросание двух кубиков. После того, как вы выбросили первый, какова вероятность, что второй будет равен первому при выпадении? 1/6.

Теперь запишите число от 1 до 6 и бросьте кости. Какова вероятность того, что игральные кости будут соответствовать тому, что вы только что написали? 1/6.

8
ответ дан 6 December 2019 в 08:44
поделиться

ЕСЛИ генератор случайных чисел действительно случайный, то оба подхода дают одинаковый результат. Однако компьютерные генераторы случайных чисел не идеальны. Я сомневаюсь, что недостатков достаточно, чтобы иметь значение, но единственный способ узнать наверняка - это попробовать - провести тест как можно дольше и посмотреть, есть ли отклонения от того, что должно быть. Вам понадобятся как минимум миллионы случайных чисел.

3
ответ дан 6 December 2019 в 08:44
поделиться

Это не касается напрямую вашего вопроса, но вы можете вместо этого взглянуть на mt_rand (). В документации PHP указано:

Многие старые генераторы случайных чисел libcs ​​имеют сомнительные или неизвестные характеристики и медленные. По по умолчанию PHP использует libc random генератор чисел с помощью rand () функция. Функция mt_rand () - это замена для этого. Оно использует генератор случайных чисел с известными характеристики с использованием »Mersenne Twister, который будет производить случайные числа в четыре раза быстрее, чем в среднем предоставляет libc rand ().

Из http://www.php.net/manual/en/function.mt-rand.php .

2
ответ дан 6 December 2019 в 08:44
поделиться

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

Править : Сказав, что я не имеют никакой внутренней информации о том, как работает генератор случайных чисел по умолчанию в php.

1
ответ дан 6 December 2019 в 08:44
поделиться

Теоретически да, оба выражения имеют одинаковую вероятность того, что они верны. Это предполагает, что генератор случайных чисел PHP на самом деле является случайным - в противном случае одно будет более вероятным, чем другое.

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

-4
ответ дан 6 December 2019 в 08:44
поделиться

Вариант 1 гарантированно верен.

Я не думаю, что в свое время узнал достаточно вероятностей и статистических данных, чтобы сказать верен ли вариант 2.

Я, однако, узнал, что НИКОГДА нельзя доверять чужому генератору случайных чисел, не запустив на нем тестовые программы, чтобы понять, насколько он ДЕЙСТВИТЕЛЬНО случайный.

В вашем случае, Я проверил несколько миллионов тестовых примеров для обоих вариантов и посмотрел, дает ли Вариант 2 статистику, аналогичную Варианту 1.

0
ответ дан 6 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: