2014-04-17 185 views
-1

如何生成1和3之间的随机数? 有了这个功能,我得到有时0(我只希望有1,2或3):1和3之间的随机数

ziehen=rand() % 3 + 1; 

为什么我要在主程序中添加函数srand(0)? 我已添加

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

到Libaries。这是足够的还是我需要更多?

+3

_'or我需要更多?'_是否行得通? –

+0

啊,好老的剩余技术。请阅读http://ericlippert.com/2013/12/16/how-much-bias-is-introduced-by-the-remainder-technique/ – harold

+0

获取rand()的结果副本,并将其用于计算ziehen。当ziehen为零时打印它的值。看看哪些数值会让你零。 – cup

回答

1

该代码永远不会返回0. rand()总是返回一个介于0和RAND_MAX之间的数字。

模操作返回一个介于0和2之间的值。加1会得到你想要的结果。 不需要括号。模数等于上述加数。

你不必添加srand(0),但是如果你这样做,你总会得到相同的数字序列。阅读文档。

+0

从技术上讲,你称之为“模运算”被称为“余数”。它返回-2和2之间的值(提示)。 –

+1

但是我们只有0和RAND_MAX之间的值。这怎么可能是消极的? – xMRi

+0

是的,我想知道OP如何管理它(并且OP说包含了stdlib.h,它应该提供'rand()'的原型 - 缺少原型是我想到的方法之一) –

2

您必须从不使用模数来减少输出的周期性rand()。原因?这是因为标准线性同余发生器的低位比较高位比较不随机:模数丢弃高位。

最好的办法是使用(3.0 * rand()/(RAND_MAX + 1.0)) + 1.0;。通过将输出分配给整型,隐式将其转换为int

RAND_MAX由C标准定义,它的值是依赖于实现

+0

嗯,这将返回'[0; 3]'? –

+0

是的,当隐式转换为'(int)'时,它将返回1,2或3.我已经修改了一些更多的细节。 – Bathsheba

+2

可能会好一点,并且经常作为解决方案给出,但它也不正确,请参阅http://www.azillionmonkeys.com/qed/random.html – harold