在Java中生成特定随机数的可能性

问题描述

如果我有一个随机数生成器,它生成数字0-1,是否可以提高它生成某些数字的概率? 假设随机数生成器上的.5+值等于蓝色,而较低的数字等于红色。我可以这样做,以便用户可以输入百分比形式的数字以增加/减少产生红色的可能性吗?

解决方法

从您的问题中得知您正在使用Math.random()

停止这样做;将0-1范围修改为有限选择的统一选择,例如:

int fairDie = 1 + (int) (Math.random() * 6)

因为那是不公平的。

相反,请使用:

Random r = new Random(); // do this only once for the app.
int fairDie = 1 + r.nextInt(6);

以上是真的

如果您想从一个有限的选择中选择一个,并且希望其中的一些选择更频繁地出现,最简单的方法是列出一个选择列表,尽可能多地重复输入以获得正确的赔率。例如,如果选择是红色,绿色和蓝色,并且要以1:2:3的方式选择它们,请尝试:

List<String> colors = new ArrayList<String>(List.of("red","green","blue","blue"));
Collections.shuffle(colors);
System.out.println("Chosen: " + colors.get(0));

这使用随机播放,在后台使用适当的随机类型(公平和统一)。另一种选择是简单地创建范围:[0-1]是红色,[1,3)是绿色,[3,6)是蓝色,然后是rnd.nextInt(6)

等等,为什么那是“不公平”?

我们可以用鸽子洞原理证明这一点。

Math.random()返回一个双精度值。电脑不是神奇的东西。双精度数由64位表示,并且由于数学运算,最多可以表示2^64个不同的数字。这是很多数字,但是它会减少一些,因为双精度数也可以表示0-1范围以外的数字,但是Math.random()永远不会返回它们。

关键是Math.random()可能返回的数量有限。可以肯定,这是一个很大的数字,但数量有限。假设是1239235915810453815个不同的选项。

您想从6个选项中公平地进行选择。

问题是,6不能平均分为1239235915810453815。这意味着不可能公平地做到这一点。假设Math.random()返回9个不同的数字,而您正在使用它来掷出一个公平的骰子。好吧,那9个中有6个在骰子上获得1-6,剩下的3个进入..什么? 2 4 4现在2/4/6的可能性是1/3/5的两倍。您无法获得公正的结果。

rnd.nextInt(5)解决了这一问题并保证了公平性,这就是为什么您应该使用它。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...