C语言:rand()函数的算法是否有点...
本帖最后由 额外减小 于 2023-2-6 13:08 编辑让我们运行这个程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
time_t t;
time(&t);
for(int i=0;i<100;i++)
{
srand((unsigned)t);
printf("%d\n",rand());
t++;
}
return 0;
}
将会得到一串很水的伪随机数列。如下:
28210
28213
28216
28219
28223
28226
28229
28233
28236
28239
28242
28246
28249
28252
28255
28259
28262
28265
28268
28272
28275
28278
28281
28285
...
请问有大神可以说明根本的原因是什么吗?
如果rand()函数的返回值真的只是随着种子增大而不断加3/加4...
那是不是有点太奇怪了吧!
有人可以说明具体的算法是怎样的吗?
当然,做一些小小的改进后就会好很多。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
time_t t;
time(&t);
for(int i=0;i<100;i++)
{
srand((unsigned)t);
printf("%d\n",rand());
t=t*(rand()%100)-rand()*2;
}
return 0;
}
28957
27620
3391
18332
10773
23052
21548
19443
29158
20162
119
11227
13053
18288
30477
27599
16445
3221
1351
1083
27932
15503
4292
2912
27957
12361
4772
17276
16231
...
谢谢解答
C 标准库的 rand 确实是没有随机数质量保证的,但这里和您使用的方式有些奇怪应该也有关系
srand 设置 rand 的种子,一般不会像这样在短循环里重复设置多次 dolly_yos2 发表于 2023-2-6 08:38
C 标准库的 rand 确实是没有随机数质量保证的,但这里和您使用的方式有些奇怪应该也有关系
srand 设置 ran ...
谢谢{:10_256:}
页:
[1]