Генерация взвешенного случайного числа C # - PullRequest
1 голос
/ 04 октября 2011

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

Я хочу просто получить случайное число от 0 до 10, которое является «средневзвешенным», так как число 5 встречается чаще, чем 0 и 10. В основном я пытался выяснить алгоритм, в котором я могу дать любой число, которое будет «взвешенным числом» между минимальными и максимальными значениями, которые я определил, и все сгенерированные числа будут взвешены соответствующим образом. Я знаю, что это может звучать так: «Я не хочу думать об этом, я просто сижу и жду, пока кто-нибудь другой сделает это», но я думал и искал об этом около часа, и я действительно потерян : |

Итак, в конце я хочу, чтобы я мог вызвать (через метод расширения)

random.NextWeighted(MIN, MAX, WEIGHT);

Ответы [ 2 ]

4 голосов
/ 04 октября 2011

У вас есть метод обратного нормального распределения .

  1. Масштабируйте случайное число так, чтобы оно было двойным от нуля до единицы.

  2. Передайте его в InverseNormalDistribution.

  3. Масштабирование возвращаемого значения на основе веса. (Например, разделите на вес более 100.)

  4. Рассчитать [(MIN + MAX) / 2] + [(ScaledValue) X (MAX - MIN)]

  5. Если это меньше, чем MIN, вернуть MIN. Если это больше, чем MAX, верните MAX. В противном случае верните это значение.

3 голосов
/ 04 октября 2011

Я не знаю, как часто вы хотите, чтобы число 5 появлялось по сравнению с другими числами в диапазоне от 0 до 10, но вы можете создать массив с нужным вам распределением.

Что-то вроде

var dist = new []{0,1,2,3,4,5,6,7,8,9,10,5,5,5};

Тогда вы получите случайные позиции от 0 до 13, вы получите числа от 0 до 10, но в 5 раз чаще, чем другие. Довольно быстро, но не очень практично, если вам нужны цифры от 0 до миллиарда.

...