用C++生成一个4位随机数

4
我需要在C++中生成一个四位随机数。
我使用了以下代码。
#include<time.h>

int number;

number=rand()%1000;
srand ( time(NULL) );

但它并不会给出完全随机的数字。

1
作为对已接受答案的补充,这里有一篇非常好的文章,涉及rand()和srand()的正确使用方法,网址为http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx。 - manneorama
3个回答

24
number = rand() % 9000 + 1000;

有9000个四位数,对吧?从1000到9999。 rand()会返回从0到RAND_MAX的一个随机数。rand() % 9000将从0到8999,rand() % 9000 + 1000;将从1000到9999。一般而言,如果您想要一个从a到b(含)之间的随机数,公式为:

rand() % (b - a + 1) + a

还要注意,srand()应该只被调用一次,并在任何rand()之前调用。

如果你把0到999之间的数字包括在“四位数”里,请在这种情况下使用rand()%10000。我不认为它们是四位数,但以防万一,我涵盖了所有可能性。

希望对你有帮助


我相信原帖作者可以自己解决第一部分。顺便说一下,0045不是一个四位数的事实是有争议的。重要的是首先调用srand以获得“完全随机的数字”。 - log0
1
+1。我还可以建议,如果有即使是最微小的可能性,这个程序将在一个紧密的循环中运行多次,请在srand(time(0))之前插入sleep(1),以便更好地选择种子。这将避免不可避免的“为什么我的随机序列不随机?”的问题 :-) - paxdiablo

4

记得只调用srand一次。

如果你不喜欢rand的分布,请查看Boost.Random

// produces randomness out of thin air
boost::mt19937 rng;

// distribution that maps to 1000..9999
boost::uniform_int<> fourdigits(1000,9999);

// glues randomness with mapping
boost::variate_generator<boost::mt19937&, boost::uniform_int<> > die(rng, fourdigits);

// simulate rolling a die
int x = die();

3
用核武器杀麻雀,我们这是?:) 开玩笑的,我喜欢boost库,但对于看起来是初学者的操作员来说可能太过强大了。 - Armen Tsirunyan
2
虽然公平地说,这在C++0x中是标准的,因此应该是分配数字的标准方式。 - GManNickG
@GMan:不管它是否标准,对于初学者而言这仅仅是太复杂了。我的观点是,虽然我们有了标准,但也许应该将其保留给中高级学习者使用。 - Armen Tsirunyan
1
@Armen Tsirunyan:我同意使用“nuke”(指清除代码中的随机数)。虽然使用Boost.Random需要更多的代码,但我可以看出人们认为boost::uniform_int<> fourdigits(1000, 9999)rand() % 9000 + 1000更合乎逻辑。 - dalle

2

在调用rand()之前,您必须先使用随机生成器srand进行种子初始化

#include<time.h>

srand( time(NULL) );
int number = rand() % 10000; // number between 0 and 9999

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接