【发布时间】:2017-07-16 07:36:34
【问题描述】:
我一直在尝试找到一种方法来生成一个更有可能生成一个范围中间的数字的数字。给定:
rnum = r.nextInt(5) + 1;//+ 1 to exclude 0
生成一个介于 1 和 5 之间的完全随机数(如果删除了 + 1,则为 0 和 4)。我想做的是少生成 1 和 5,生成很多 3。我试过这个:
int[] classes = {1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5};
System.out.println("Class " + classes[r.nextInt(15)]);//logs the output
但它会生成这个:(打印语句重复 10 次)
Class 2
Class 3
Class 1
Class 4
Class 3
Class 4
Class 2
Class 3
Class 2
Class 5
但是,这既不是有效的方法,也不是很好的方法。此外,由于用于检索数字的随机数生成器是完全随机的,而不是专注于中心值,因此产生了上面的输出。 3 只出现 30% 的时间,太低了。 2 也出现 30% 的时间,这意味着(在此测试中)它与 3 具有相同的概率。
那么,如何随机生成一个数字,以更高的概率生成一个范围中间的数字?
【问题讨论】:
-
10 次是一个太小的样本,无法推断出准确的概率并获得所需的分布。你的做法很好。
-
补充@JBNizet 说的。在 for 循环中添加打印并以编程方式计算输出以计算百分比以获得更好的站点。我建议 1000 次循环迭代。
-
您可能需要考虑将binomial distribution 作为随机变量。
-
具有更具代表性的样本:ideone.com/uFhzKA
-
你这里有些误会。 一个特定样本中的概率与频率无关。与样本中有多少条目无关(即使可能性极小),样本仍有可能仅包含 1 个。