我想要一个随机数生成器来模拟抛硬币,这就是我做的事情
public class CoinToss
{
public static void main(String args[])
{
int num=(int)(1000*Math.random());
if(num<500)
System.out.println("H");
else
System.out.println("T");
}
}
结果令人沮丧,因为我在20次跑中得到16个头和4个尾巴。 不是随机的。它可能,但如果程序是正确的,我想要一般意见?我在数学上遗漏了什么吗?
答案 0 :(得分:1)
20次运行的样本量不足以评估它的随机性。可以这样想:如果你做了4次跑步并得到了4个头,那你就会想,&#34;哇,这根本不是随机的。&#34;但事实上,如果你拿了4个硬币,并将它们翻了16次,那么你应该至少得到所有4个头。因此,如果您进行少量运行,并且您得到的结果在头尾之间不是平均分配的,那并不意味着它不是随机的。
或者以这种方式看待它:如果你写了一些刚打印的代码&#34; Heads&#34;那么&#34; Tails&#34;然后&#34;负责人&#34;等等,你得到半个半头和半个尾巴。但这根本不是随机的!它只是一种重复模式。
因此,当随机结果在短期内看起来不均匀时,故事的寓意不会让人感到惊讶。尝试重新编写代码,以便计算出多少个头和多少尾巴,然后让它翻转大约一百万左右,看看你是不是每个大约有500,000个。它应该多一点或多一点,因为随机并没有给你准确,但它应该更接近。
答案 1 :(得分:0)
您的代码似乎是正确的,尽管您可以更轻松地实现它:
Random r = new Random();
int num = r.nextInt(2);
if (num == 0)
System.out.println("H");
else
System.out.println("T");
Random#nextInt(int i)
会在0
和i-1
答案 2 :(得分:0)
您需要更多输入才能获得相同数量的输入。对于如此少量的输出,有时你会在数字方面让它们彼此接近,有时候一方会显示&#34;显示&#34;其他方式更多。实际上,4
尾巴和16
头部的概率是0.462%
,这在某种程度上是现实的&#34;发生...尝试使用更多的运行次数来更多地使用它,看看它的行为方式。
顺便考虑一下这个输入:
6 6 6 6 6 6 6 6 6 6
看起来不是随机的,对吧?但它在某个时刻以数字π
的十进制存在,因此它是随机序列的一部分。它只是一个系列大小的问题,因此当你使用随机数时,你必须以这种方式思考。更多地考虑随机生成器而不是结果。您正在使用正确的函数,因为它基于System.nanoTime(),因此生成器是正确的,但您的结果是小的。
答案 3 :(得分:0)
伪随机数发生器(PRNG),也称为确定性随机比特发生器(DRBG),是一种用于生成数字序列的算法,其特性近似于随机数序列的属性。
PRNG生成的序列不是真正随机的,因为它完全由一组相对较小的初始值决定,称为PRNG的种子
虽然可以生成更接近真正随机的序列
任何考虑产生随机数字的算术方法的人当然都处于罪恶状态。约翰冯诺伊曼
答案 4 :(得分:0)
稍微修改了你的代码,它看起来很随机。
代码:
int h = 0;
int t = 0;
for (int i = 0; i < 1000; i++) {
int num = (int) (1000 * Math.random());
if (num < 500) {
h++;
} else {
t++;
}
}
System.out.println("T:" + t);
System.out.println("H:" + h);
输出:
T:506
H:494
我猜这是随机性的事情^^