Генерация случайных чисел без использования битовых операций - PullRequest
6 голосов
/ 18 июня 2009

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

Ответы [ 4 ]

5 голосов
/ 18 июня 2009

Если вы не возражаете против дурацкой случайности, классический метод -

x[n+1] = (x[n] * x[n] + C) mod N

, где C и N - константы, C! = 0 и C! = -2, а N - простое число. Это типичный псевдослучайный генератор для факторизации Полларда Ро. Попробуйте C = 1 и N = 8051, все в порядке.

2 голосов
/ 18 июня 2009

Верьте или нет, я использовал newx = oldx * 5 + 1 (или небольшое изменение этого) в нескольких видеоиграх. Случайность ужасна - это скорее зашифрованная последовательность, чем генератор случайных чисел. Но иногда это все, что вам нужно. Если я правильно помню, он проходит через все числа, прежде чем повторить.

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

Мы использовали его, когда не было доступного нам хорошего модуля. Это просто смещение на два и два добавления (или умножение на 5 и одно добавление). В настоящее время я бы никогда не использовал его для случайных чисел - я бы использовал LCG - но, возможно, он будет работать нормально для шейдера, где скорость важна и ваш набор команд может быть ограничен.

2 голосов
/ 18 июня 2009

Используйте линейный конгруэнтный генератор :

X_(n+1) = (a * X_n + c) mod m

Они не так сильны, но по крайней мере они хорошо известны и могут иметь длительные периоды. На странице Википедии также есть хорошие рекомендации:

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

1. c and m are relatively prime,
2. a - 1 is divisible by all prime factors of m,
3. a - 1 is a multiple of 4 if m is a multiple of 4
2 голосов
/ 18 июня 2009

Вершинные шейдеры иногда имеют встроенные генераторы шума, такие как функция noise() cg.

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