существует ли такая вещь как случайным образом доступный генератор псевдослучайного числа? (предпочтительно открытый исходный код)

прежде всего есть ли такая вещь как генератор случайных чисел произвольного доступа, где Вы могли не только последовательно генерировать случайные числа, поскольку мы все привыкли к, предполагая, что 100 рэндов () всегда генерируют значение от 0-100:

for (int i=0;i<5;i++)
   print rand100()

output: 
14
75
36
22
67

но также и случайным образом доступ любое случайное значение как:

100 рэндов (0) произвели бы 14, пока Вы не изменили семя

100 рэндов (3) всегда производили бы 22

100 рэндов (4) всегда производили бы 67

и так далее...

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

Существует ли seedable генератор случайных чисел произвольного доступа, предпочтительно открытый исходный код? или существует ли лучший термин для этого, я могу погуглить для получения дополнительной информации?

в противном случае часть 2 моего вопроса была бы, там какой-либо надежно случайный стандартный seedable генератор псевдослучайного числа с открытым исходным кодом, таким образом, я мог портировать его на несколько платформ/языков при сохранении последовательной последовательности значений для каждой платформы для какого-либо данного семени?

14
задан nsfnotthrowingaway 10 June 2010 в 23:08
поделиться

3 ответа

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

Это класс perlin noise, который можно найти здесь. Я не уверен, насколько это вычислительно сложно по сравнению с обычным генератором случайных чисел, что вызывает беспокойство, поскольку одной из планируемых платформ является Android. Кроме того, перлиновый шум - это не то же самое, что псевдослучайность, но, насколько я могу судить, высокое значение октавы и/или частоты должно обеспечить подходящую случайность для некриптографических целей, где статистический уровень истинной случайности не так важен, как простое появление случайности.

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

вот пример набора обычной случайности c++ (rand%200) в левой колонке для сравнения, и шума perlin (с эквивалентом %200) в правой:

91 , 100
48 , 97
5 , 90
93 , 76
197 , 100
97 , 114
132 , 46
190 , 67
118 , 103
78 , 96
143 , 110
187 , 108
139 , 79
69 , 58
156 , 81
123 , 128
84 , 98
15 , 105
178 , 117
10 , 82
13 , 110
182 , 56
10 , 96
144 , 64
133 , 105

оба были посеяны на 0

параметры для шума perlin были

octaves = 8
amplitude = 100 
frequency = 9999
width/height = 10000,100

порядок последовательной выборки для шума perlin был прост

for (int i=0;i<24;i++)
    floor(Get(i,i)+100);
//amplitude 100 generates noise between -100 and 100, 
//so adding 100 generates between 0 and 200
3
ответ дан 1 December 2019 в 13:08
поделиться

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

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

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

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

Или создайте длинный список и сохраните его.

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

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