Что правильный метод ограничения является pseduo-случайным-числом к меньшему диапазону?

Спасибо за указатель jmesolomon. Я обнаружил, что проблема заключалась в том, что у меня было две ссылки на Microsoft.NETCore.App в файле проекта .csproj. Я удалил второй, который включает ссылку на версию, и теперь все проекты используют 2.2.0

удалено:

  <ItemGroup>
    <PackageReference Update="Microsoft.NETCore.App" Version="2.2.1" />
  </ItemGroup>
7
задан Community 23 May 2017 в 12:26
поделиться

5 ответов

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

Если сомневаетесь, попробуйте сами.

РЕДАКТИРОВАТЬ

Следует отметить, что многие языки (например, C #) имеют встроенные ограничения в своих функциях

int maximumvalue = 20;
Random rand = new Random();

rand.Next(maximumvalue);

И, когда это возможно, вы должны использовать их, а не какие-либо код вы бы написали сами. Не изобретай колесо.

2
ответ дан 7 December 2019 в 18:45
поделиться

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

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

0
ответ дан 7 December 2019 в 18:45
поделиться

Если у вас есть доступ к функции PRNG (скажем, random ()), которая будет генерировать числа в диапазоне 0 <= x <1, не могли бы вы просто:

 random_num = (int) (random() * max_range);

дать вам числа в диапазоне от 0 до max_range?

0
ответ дан 7 December 2019 в 18:45
поделиться

Psuedo random генераторы чисел по сути производят случайные серии 1 и 0, которые при добавлении друг к другу, бесконечно большое число в базе два. каждый раз, когда вы немного потребляете, вы делите это число на два и сохраняете модуль. Вы можете делать это вечно, не тратя впустую ни одного бита.

Если вам нужно число в диапазоне [0, N), тогда вам нужно то же самое, но вместо базы два вам нужна база N. Это в основном тривиально для преобразования основания. Извлеките количество битов, которое вам нужно, верните оставшуюся часть этих битов обратно в ваш prng для использования в следующий раз, когда потребуется число.

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

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

0
ответ дан 7 December 2019 в 18:45
поделиться

Вот как работает случайный класс CLR, когда он ограничен (согласно Reflector):

long num = maxValue - minValue;
if (num <= 0x7fffffffL) {
    return (((int) (this.Sample() * num)) + minValue);
}
return (((int) ((long) (this.GetSampleForLargeRange() * num))) + minValue);

Даже если вам дают положительный int, нетрудно получить его в два раза. Просто умножьте случайное int на (1 / maxint). Переход от 32-разрядного типа int к двойному должен обеспечить адекватную точность. (Я на самом деле не тестировал такой PRNG, так что я мог бы что-то упустить с плавающей точкой.)

0
ответ дан 7 December 2019 в 18:45
поделиться
Другие вопросы по тегам:

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