1
sli 2015-09-14 17:50:04 +08:00
time_t tTime;
time (&tTime ); srand ((unsigned int )tTIme ); int n = rand ()%1000*1000+rand ()%1000; |
2
sli 2015-09-14 17:51:54 +08:00
呃,写完想起来貌似不能保证是 6 位数...失误了....
|
3
shuax 2015-09-14 17:54:18 +08:00 1
static UINT32 next = 1;
int __cdecl rand (void ) { next = next * 1103515245 + 12345; /* return (unsigned int )(next / 65536 ) % 32768;*/ return (UINT32 )(next>>16 ) & RAND_MAX; } void __cdecl srand (unsigned int seed ) { /* And you *should* get a warning if sizes dont match */ next = seed; } 看源代码你就知道为什么有个 srand 了 |
4
speed OP rand ()%10 表示将产生的随机数对 10 求余,结果为余数,整体表示产生 0 到 9 的随机数。为啥这种方式不可取?
|
5
iamleung 2015-09-14 18:06:41 +08:00
int max = 999999;
int min = 100000; srand ((int )time (0 )); int result = rand ()%(max - min + 1 ) + min; |
6
YUCOAT 2015-09-14 18:33:01 +08:00
unsigned RandNumber ()
{ srand ((int )time (NULL )); unsigned uRet = 0; for (int i = 0; i< 6; ++i ) { uRet = uRet * 10 + (rand () % 10 ) } return uRet; } |
8
jimzhong 2015-09-14 18:49:17 +08:00 1
不建议用取模的方式获得给定范围的随机数,因为 rand 不能保证取模后分布依然随机。应该先除以 RAND_MAX 映射到[0,1]区间,然后在拉长到你要的区间。
srand 是给种子,如果 srand 的参数值相同,那么 rand 出来的序列也相同。 |
12
SeaOverflow 2015-09-15 09:09:07 +08:00
3 楼正解, rand ()是根据随机数种子产生随机数,如果随机数种子不变,那么多次运行产生的随机数都是一样的(每次运行都是从 100,200,300 这种顺序结果),即是伪随机。 srand ()是更改随机数种子,以保证 rand ()产生的随机数是真随机,一般使用系统时钟来更改随机数种子。(如有错误请轻喷!)
|
13
w99wen 2015-09-15 09:55:01 +08:00
先说下所谓的随机的意思:
其实 c/c++里面的随机都是基于一张表。这张表保证每个位置每个数字出现的概率是一样的,也就是一张随机表。 rand ()函数是每次都从同一个位置开始,节次取值,每个数字出现的概率也是一样的,取到的也是随机的,不过因为每次都是从同一个位置开始,数字出现的顺序都是一样的。这显然不是我们想看到的。这种方式的到的结果,也就是我们说的伪随机,虽然每个数字再每个位置出现的概率是相同的,可是因为表是固定的,我们总是能有办法知道下一个值是多少。 那么怎么解决这个问题那,那就是每次在那张随机表里取值的时候,在不同的位置开始取值。这个也就是 srand (), srand = seed + rand 的缩写。我们用 srand (n ),从位置 n 取值, n 是可变的, n 一般用 time (0 ),并且应该保证 n 的随机性。这样就能得到一组完全随机的随机数据了。 |