Почему существует вероятность больших чисел при использовании rand ()

0

Я думаю, странный вопрос. Это из любопытства.

Используя функцию rand(), если мы установим параметры между 1-10, я затем несколько раз проверил тест на своих машинах операционной системы UNIX, а точнее Ubuntu. Мои результаты всегда показывали более высокие числа (более 5), которые, скорее всего, возвращались. Это казалось совсем не так, как если бы это было случайно.

Я также прочитал модуль, который утверждает, что, используя операцию модуля, мы формируем какой-то смещение.

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

Почему это? Также он сказал, что более низкие цифры становятся более вероятными, однако я получаю более высокие цифры

  • 2
    Вы не можете установить диапазон функции rand() , покажите свой код.
  • 1
    От самого мистера STL: rand () Считается вредным
Показать ещё 10 комментариев
Теги:
random

1 ответ

3

Как проверить предвзятость

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

int random_int(int min, int max)
{
    return min + rand() % (max - min + 1);
}

Предположим, вы не заселили числа.

int main(int argc, char **argv)
{   
    int histo[10];
    for (int i = 0; i < 10; i++) 
        histo[i] = 0;
    for (int i = 0; i < 10000; i++) 
        histo[random_int(1, 10) - 1]++;
    for (int i = 0; i < 10; i++)
        printf("%d\n", histo[i]);
}

Это даст нам 10 000 образцов, которые небольшие, но работоспособные. Я получаю следующие результаты. Если вы используете ту же версию glibc, вы получите то же самое.

1053
980
1002
959
1009
948
1036
1041
987
985

Мы ожидаем, что бункеры будут следовать за биномиальным распределением, учитывая несмещенный генератор. Для 10000 выборок мы ожидаем, что дисперсия по каждому ядру будет равна Np (1-p) или 900, что дает стандартное отклонение ровно 30. Наша дисперсия выборки составляет 1105. Теперь я не собираюсь делать ничего строгого здесь... Я собираюсь притвориться, что биномиальные распределения нормальны... и я просто собираюсь сделать простой тест на квадрат. Результаты p = 0,2. Не совсем проклятие.

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

Modulo bias

По модулю смещение фактически увеличивает вероятность меньших чисел, а не более высокие числа. RAND_MAX очень мало для таких диапазонов (1..10), потому что RAND_MAX составляет 2 31 -1 для glibc, и это дает увеличение вероятности малых чисел примерно на 1 из 200 миллионов. Вам нужно будет выполнить большее количество тестов, чтобы выявить смещение по модулю.

Основная причина, по которой modulo обескуражена, заключается в том, что низкие биты общих реализаций rand() показывают слабую независимость. Конечно, вы также не должны использовать эту технику для создания больших диапазонов.

рекомендации

Если вы действительно хотите протестировать генератор случайных чисел, я предлагаю изучить тесты Марсалья "Диярд". Если вам нужен хороший генератор случайных чисел, вы можете использовать arc4random, Mersenne Twister или /dev/urandom. Ваш выбор будет отличаться в зависимости от того, разрабатываете ли вы криптографическое приложение или используете результаты для моделирования методом Монте-Карло.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню