掷硬币使用随机数并不恰好出现随机
我想要一个随机数生成器来模拟掷硬币,并在这里就是我所做的掷硬币使用随机数并不恰好出现随机
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尾运行。 那不是出现是随机的。它的可能性,但如果程序是正确的我想要一个普遍的意见?我是否缺少数学的东西?
修改了你的代码,它看起来足够随机。
代码:
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
我想这是事物与随机性^^
你的代码似乎是正确的,虽然你可以实现很容易:
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
你的代码似乎是正确的,虽然你可以更容易地实现它:'r.nextBoolean();';) – Kayaman
你为了得到每一个同等数量的需要的方式更多的输入之间的随机整数。对于这样少量的输出,有时你会使它们在数字方面接近,有时候一方会“显示”多于另一方。实际上,有4
尾巴和16
首长的概率是0.462%
,这是有点“现实”的发生......尝试更多地使用它运行更多数量的运行并查看它的行为。
而且顺便说一句想一想输入:
6 6 6 6 6 6 6 6 6 6
似乎并不随机的,对不对?但它在某个点存在于数字π
的小数点,所以它是随机序列的一部分。它只是一个系列大小的问题,所以当你使用随机数字时,你必须这样思考。多想想随机生成器而不是结果。你使用正确的函数,因为它基于System.nanoTime(),所以生成器是正确的,但你的结果是很小。
20次运行的样本量不够大,无法评估它的随机性。你可以这样想:如果你做了4次跑步并拿到4次头,你会想:“哇,那根本不是随机的。”但事实上,如果你拿了4个硬币,并翻转了16次,你至少会得到4个硬币。所以,如果你做了少量的跑步,并且你得到的结果在头部和尾部之间并不是等分的,那并不意味着它不是随机的。或者看看它:如果你写了一些代码,只是打印“头”,然后“尾巴”,然后“头”等,你会得到正好半头半尾巴。但那根本不是随机的!这只是一种重复模式。
因此,随机结果在短期内看起来不均匀的情况下,故事的寓意不会感到惊讶。尝试重新编写代码,以便计算多少头和多少尾,并让它翻转大约一百万左右,并查看各自是否得不到约500,000条。它应该多一点或少一点,因为随机不会给你确切的,但它应该更接近。
伪随机数发生器(PRNG),也称为确定性随机位发生器(DRBG),是一种用于生成其属性近似于随机数序列属性的数字序列的算法。
的PRNG生成的序列不是真正随机的,因为它完全由相对小的组初始值决定的,称为PRNG的种子
虽然更接近真正随机的,可以产生的序列
任何考虑产生随机数字的算术方法的人当然都处于犯罪状态。 John von Neumann
尝试运行它更多的时间。你可能会得到更好的结果。 – Hackerdarshi
20个样本在数学上是无意义的,托盘再次具有更大的样本(至少10k) – Preuk
是的,@Preuk是对的。我只是用max_int循环遍历你的例子,结果如下:H:1073754033,T:1073729614 – Christoph