Быстро случайный генератор

От MSDN:

Компромиссы Замыкания накоротко

Замыкание накоротко может улучшить производительность, не оценив выражение, которое не может изменить результат логической операции. Однако, если то выражение выполняет дополнительные действия, закорачивая пропуски те действия. Например, если выражение включает вызов в Функциональную процедуру, ту процедуру не называют, если выражение закорачивается, и любой дополнительный код, содержавшийся в Функции, не работает. Если Ваша логика программы зависит от какого-либо того дополнительного кода, необходимо, вероятно, постараться не закорачивать операторы.

10
задан tazzo 24 November 2009 в 15:24
поделиться

5 ответов

Тот факт, что вы заполняете байты целыми числами, достаточно отличается от типичного случая использования System.Random, и вы, вероятно, сможете его сильно превзойти, если вам действительно нужно.

System. Произвольный предназначен для общего использования. (На самом деле, я обычно нахожу системные случайные подпрограммы скучными, когда я провожу для них тесты скорости и распределения.) Бывают случаи, когда вам нужно что-то еще. Но вы должны очень четко заявить о своих потребностях. Как быстро? От чего вы готовы отказаться?

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

последнее касается того факта, что вы нацеливаетесь на байты.

Мне нужны были только сверхбыстрые случайные числа несколько раз. В консольных играх с медленными процессорами, где случайный выбор может иметь значение между достижением целевой частоты кадров и невыполнением ее. Какой у вас вариант использования? Обязательно используйте System.Random, если можете.

Или адаптируйте подпрограмму, на которую вы ссылаетесь в своем вопросе (который, как утверждает автор, в 8 раз быстрее System.Random.)

Последний касается того факта, что вы нацеливаетесь на байты.

Мне нужны были только сверхбыстрые случайные числа несколько раз. В консольных играх с медленными процессорами, где случайный выбор может иметь значение между достижением целевой частоты кадров и невыполнением ее. Какой у вас вариант использования? Обязательно используйте System.Random, если можете.

Или адаптируйте подпрограмму, на которую вы ссылаетесь в своем вопросе (которая, по утверждению автора, в 8 раз быстрее System.Random.)

Последний касается того факта, что вы нацеливаетесь на байты.

Мне нужны были только сверхбыстрые случайные числа несколько раз. В консольных играх с медленными процессорами, где случайный выбор может иметь значение между достижением целевой частоты кадров и невыполнением ее. Какой у вас вариант использования? Обязательно используйте System.Random, если можете.

Или адаптируйте подпрограмму, на которую вы ссылаетесь в своем вопросе (которая, по утверждению автора, в 8 раз быстрее System.Random.)

26
ответ дан 3 December 2019 в 14:25
поделиться

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

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

13
ответ дан 3 December 2019 в 14:25
поделиться

Если у вас есть генератор случайных чисел, который возвращает числа из единичного интервала, как в упомянутой вами статье Code Project, то вы можете сначала сгенерировать значение u используя этот генератор, а затем верните a + (ba) * u , чтобы получить значения между a и b.

0
ответ дан 3 December 2019 в 14:25
поделиться

использовать криптографические службы ....

RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
byte[] bytes= new byte[5];
crypto.GetBytes(bytes);

конечно, это удовлетворяет только требованиям байтовой области ...

-1
ответ дан 3 December 2019 в 14:25
поделиться

Вы можете использовать Reflector для декомпиляции System.Random в C #. Это даст вам код C # быстрого генератора случайных чисел, который удовлетворяет вашим требованиям.

-4
ответ дан 3 December 2019 в 14:25
поделиться
Другие вопросы по тегам:

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