鱼C论坛

 找回密码
 立即注册
查看: 2771|回复: 2

[吹水] C语言:rand()函数的算法是否有点...

[复制链接]
发表于 2023-2-6 01:04:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 额外减小 于 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
...

谢谢解答
[/code]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-6 08:38:32 | 显示全部楼层
C 标准库的 rand 确实是没有随机数质量保证的,但这里和您使用的方式有些奇怪应该也有关系
srand 设置 rand 的种子,一般不会像这样在短循环里重复设置多次

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
额外减小 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-6 12:23:35 | 显示全部楼层
dolly_yos2 发表于 2023-2-6 08:38
C 标准库的 rand 确实是没有随机数质量保证的,但这里和您使用的方式有些奇怪应该也有关系
srand 设置 ran ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 09:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表