Жизнеспособность использования наносекундного компонента "tv_nse c", возвращаемого функцией "Timespec_get ()" в Linux, в качестве генератора случайных чисел в C? - PullRequest
0 голосов
/ 16 января 2020

Со следующим простым фрагментом кода:

struct timespec ts;
for (int i = 0; i < 100; i++) {
    timespec_get(&ts, TIME_UTC);
    printf("%ld, ", ts.tv_nsec % 100);
}

Я получаю вывод, подобный этому:

58, 1, 74, 49, 5, 59, 89, 20, 52, 86, 17, 48, 79, 10, 41, 73, 3, 40, 72, 3, 36, 67, 98, 30, 61, 92, 24, 55, 86, 17, 49, 82, 14, 45, 76, 7, 40, 72, 3, 36, 71, 2, 35, 66, 97, 28, 66, 97, 28, 60, 90, 22, 52, 83, 15, 46, 77, 7, 41, 72, 3, 36, 67, 0, 44, 17, 82, 13, 45, 77, 8, 59, 90, 22, 54, 85, 17, 48, 80, 12, 43, 75, 6, 57, 89, 20, 52, 84, 15, 47, 79, 14, 50, 82, 16, 47, 79, 11, 43, 74,

Я не изучал статистическое распределение числа и мои поиски оказались пустыми, но результат на первый взгляд выглядит похожим на результат rand() или random(). Кто-нибудь изучал это или может express мнение - можно ли timespec_get() использовать в качестве генератора случайных чисел? Будет ли это псевдослучайным или нет? Почему?

Ответы [ 3 ]

5 голосов
/ 16 января 2020

Может ли timespec_get() использоваться в качестве генератора случайных чисел?

Конечно. Но это не означает, что выходные данные такого ГСЧ будут иметь желательные или даже приемлемые статистические свойства.

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

Будет ли это псевдослучайным или нет? Почему?

Нет, вообще-то. Выходной сигнал PRNG составляет детерминированный c относительно состояния времени выполнения вызывающей программы во время вызова. timespec_get(), с другой стороны, зависит от контекста выполнения программы, а не от ее собственного состояния.

2 голосов
/ 16 января 2020

Может ли timespec_get () использоваться в качестве генератора случайных чисел?

Я пытался позвонить timespec_get(&ts, TIME_UTC); несколько раз и получил значения дельты около 14 +/- 1 нс. Для меня это означает в лучшем случае непредсказуемость (случайность) 1 бит на вызов (учитывая изменчивость в дельте), а не 7-8 битов, ожидаемых при timespec_get(&ts, TIME_UTC); ts.tv_nsec % 100. В худшем случае , есть почти нулевые биты случайности.

.tv_nsec и .tv_sec могут использоваться для инициализации случайного механизма, но в качестве источника , он очень слабый.

Будет ли это псевдослучайным или нет? Почему?

Нет. A PRNG является определяющим c. Время считывания не определено c недостаточно.

2 голосов
/ 16 января 2020

Код, который вы предоставили, почти наверняка гарантированно не для предоставления (псевдо) случайных чисел!

Почему?

Подумайте о запуске этого на эффективном ЦП, который может посвятить 100% своего времени вашему коду (и ничему другому «значительного влияния»), происходящему в фоне ОС: каждый прогон for l oop выполняет идентичную последовательность команд таким образом, интервалы между последовательными вызовами на timespec_get все будут очень одинаковыми - и список чисел с непрерывно сходными интервалами, безусловно, не является случайным.

Даже довольно краткий взгляд через ваш Список сгенерированных чисел показывает, что единственное время, когда число на меньше , чем его предшественник, это когда значение «переворачивает» отметку 100 (этот эффект будет более заметным, если вы увеличите свой модуль с 100 до, скажем, 500 и снова запустите тест).

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