我想知道在特定范围内生成随机数的最佳方法(例如在 Java 中)是什么,其中每个数字都有一定的发生概率?
例如
从 [1;3] 中生成具有以下概率的随机整数:
P(1) = 0.2
P(2) = 0.3
P(3) = 0.5
现在我正在考虑在 [0;100] 内生成随机整数并执行以下操作的方法:
如果它在 [0;20] 之内 –> 我得到了我的随机数 1。
如果它在 [21;50] 之内 –> 我得到了我的随机数 2。
如果它在 [51;100] 之内 –> 我得到了我的随机数 3。
你打算说什么?
原文由 marc wellman 发布,翻译遵循 CC BY-SA 4.0 许可协议
你的已经是一个很好的方法并且适用于任何范围。
试想:另一种可能是通过乘以一个常量乘数来去掉分数,然后用这个乘数的 大小 构建一个数组。乘以 10 得到
然后创建一个具有相反值的数组——“1”进入元素 1 和 2,“2”进入 3 到 6,依此类推:
P = (1,1, 2,2,2, 3,3,3,3,3);
然后你可以从这个数组中选择一个随机元素。
(添加。)使用 kiruwka 评论中示例中的概率:
导致全整数的最小乘数是 20,这给了你
因此
numsToGenerate
的长度为 20,具有以下值:分布 _完全相同_:例如,现在出现“1”的概率是 20 次中有 2 次——仍然是 0.1。
这是基于所有加起来为 1 的原始概率。如果不是,则将总数乘以相同的因子(这也将是您的数组长度)。