在java中生成特定随机数的概率

在java中生成特定随机数的概率,java,random,probability,Java,Random,Probability,如果我有一个生成数字0-1的随机数生成器,有没有办法提高它生成特定数字的概率? 假设随机数生成器上的值.5+等于蓝色,较小的值等于红色。我可以让用户输入一个数字作为百分比,以增加/减少生成红色的可能性吗?从您的问题听起来,您正在使用Math.random() 停止那样做;将0-1范围修改为有限选择的统一选择,例如: int fairDie=1+(int)(Math.random()*6) 因为这是不公平的 相反,请使用以下命令: Random r = new Random(); // do th

如果我有一个生成数字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", "green", "blue", "blue", "blue"));
Collections.shuffle(colors);
System.out.println("Chosen: " + colors.get(0));
List colors=新的数组列表(列表中的(“红色”、“绿色”、“绿色”、“蓝色”、“蓝色”));
收藏。洗牌(颜色);
System.out.println(“所选:“+colors.get(0));
这使用洗牌,这在引擎盖下使用适当的随机类型(它是公平和统一的)。另一个选项是简单地创建范围:[0-1]是红色,[1,3]是绿色,[3,6]是蓝色,然后
rnd.nextInt(6)

等等,为什么这“不公平”? 我们可以用鸽子洞原理来证明这一点

Math.random()
返回一个double。计算机并不神奇;double由64位表示,因为Math最多可以表示不同的数字。这是很多数字,但由于double也可以表示0-1范围之外的数字,所以它会变得少一些,但是
Math.random()
将永远不会返回它们

关键是,
Math.random()
可能返回的数字数量有限。可以肯定,这是一个非常大的数字,但有限。比如说,它是1239235915810453815个不同的选项

你要公平地从6个选项中选择,统一选择

问题是,6不能平均分成1239235915810453815。这意味着不可能公平地做到这一点。想象一下
Math.random()
返回9个不同的数字,你用它来掷一个公平的骰子。这9个数字中的6个在骰子上取1-6,其余3个取…什么?2、4和6?现在2/4/6的可能性是1/3/5的两倍。你无法得到公平的结果


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

询问用户想要的概率,然后检查生成的随机数是否大于或小于该概率。您只需想象一个光标。如果您想要增加红色概率,只需说
0.6
下的所有内容都是红色即可例如,如果你想增加蓝色概率,可以说所有的都超过
0.4
…等等,这并不能真正解决OP的问题,这是关于任意概率的,不一定相等。