Допустим, у вас есть массивы
String[] possibleOutcomes = new String[] { "A", "B", "C", "D" }
и
int[] possibleOutcomeProbabilities = new int[] { 30, 14, 31, 25 }
Вы можете использовать следующую стратегию всякий раз, когда вам необходимо вывести один из результатов:
- Найти сумму все элементы в
possibleOutcomeProbabilities
. Позволяет называть эту сумму totalProbability
.
- Введите произвольное число от
1
и totalProbability
. Позволяет называть это случайно сгенерированное число outcomeBucket
.
- Итерат над
possibleOutcomeProbabilities
, чтобы определить, какой результат outcomeBucket
соответствует. Затем вы выбираете соответствующий результат из possibleOutcomes
.
Эта стратегия, конечно же, не даст вам первых 30% результатов, таких как A, следующие 14% как B и т. Д. Однако, по мере того, как вероятность работает над достаточно большим количеством результатов, эта стратегия гарантирует, что ваши возможные результаты распределяются по ожидаемым вероятностям. Эта стратегия дает вам преимущество в том, что вероятности результата не должны составлять до 100%. Вы даже можете указать относительные вероятности, например, 1: 2: 3: 4 и т.д.
Если вы действительно беспокоитесь о самой быстрой реализации для стратегии, вы можете настроить его следующим образом:
, Вычислить totalProbability
только один раз, или когда вероятность изменена. b. Перед вычислением totalProbability
проверьте, имеют ли элементы в possibleOutcomeProbabilities
общие делители и устраняют их. Это даст вам пространство с меньшей вероятностью, которое будет проходить каждый раз.
Хотя если вы новичок в «Случайном», это может быть сложно сделать правильно. http://csharpindepth.com/Articles/Chapter12/Random.aspx – Oded
Случайный не будет работать, если он хочет, чтобы результаты соответствовали приблизительной ставке «попадания» 30%, 14%, 31% и т. д. (?) - У вас нет решения, но Random не является ответом на проблему. –
@ K.Bob Да, это - Random генерирует числа, которые обычно распространяются. –