Заставьте CURAND генерировать положительные разные случайные числа меньше определенного числа

Я пытаюсь использовать библиотеку CURAND для генерации случайных чисел, которые полностью независимы друг от друга. Следовательно, я хочу дать разные семена каждому потоку. Итак, вопрос 1: как дать разные семена каждому потоку? (Есть ли в CUDA функция времени, которую я могу использовать?)

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

В настоящее время я использую curand_normal (поскольку я хочу иметь числа из нормального распределения), но это дает мне отрицательные и одинаковые числа, которые мне не нужны.


person user1439690    schedule 14.09.2012    source источник


Ответы (1)


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

Ознакомьтесь с примерами в CUDA SDK, например, примеры EstimatePiP или EstimatePiInlineP используют cuRAND для генерации псевдослучайных чисел.

Что касается второй части вашего вопроса, как указано в руководстве cuRAND, подпрограммы curand_normal() возвращают нормально распределенные числа со средним значением 0,0 и стандартным отклонением 1,0 (т.е. стандартное нормальное распределение). Очевидно, это означает, что у вас будет ~ 50% отрицательных чисел.

Не имеет смысла указывать фиксированный диапазон вместе с Нормальным распределением. Вам либо нужно какое-то другое распределение (например, равномерное) с фиксированным диапазоном, либо вам нужно нормальное распределение с определенным средним и стандартным распределением. Чтобы перейти от Standard Normal к вашей цели, означает /std.dev. вы просто умножаете случайный результат на целевое стандартное отклонение и добавляете целевое среднее значение.

person Tom    schedule 14.09.2012
comment
Большое спасибо .. То есть вы хотите сказать, что если мне нужны независимые случайные числа, я могу использовать одно и то же начальное число, но мне нужно использовать разные подпоследовательности? - person user1439690; 14.09.2012
comment
Есть несколько способов получить независимые случайные последовательности: разбиение на блоки, скачкообразный переход и настраиваемые наборы параметров. Первые две фактически являются подпоследовательностями основной последовательности, третья немного отличается (и более сложна). Различные ГСЧ подходят для разных методов. Руководство cuRAND подробно описывает использование подпоследовательностей, так что это хорошее место для начала. - person Tom; 14.09.2012