| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3207 人关注过本帖
标题:哪位大牛,给我解释一下这个代码(随机数)
只看楼主 加入收藏
木下瞳
Rank: 1
等 级:新手上路
帖 子:37
专家分:6
注 册:2017-9-24
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:9 
哪位大牛,给我解释一下这个代码(随机数)
随机数的代码,产生十个随机数,打问号的地方,还有这个明明没有设置产生范围,但产生的都在100以内;而且每次运行程序的结果都一样,不是随机产生的吗?
#include<stdio.h>
#include<stdlib.h>
int main(){
    int c;
    for(c = 0;c < 10;c++)
    {
        srand(c + 2);//?
        printf("%d ",rand());//?
    }
}
搜索更多相关主题的帖子: 代码 随机数 include int c++ 
2018-02-22 13:34
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:4 
试试将srand()放到循环体外面
2018-02-22 14:26
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:4 
我也不是很懂。
可能是因为rand()是获得一个伪随机数,并不是真的随机,他需要依赖srand()获得一个随机的种子。你通过for循环得到的种子是固定的。srand()经常是用geypid()或time(NULL)的返回值来当产生种子。因为time(NULL)的机制,srand((unsigned)time(NULL))要放在循环的外面。
2018-02-22 14:27
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
大兄弟你都哪里弄来的题目啊。我也想找来练习练习。我也刚学
2018-02-22 14:39
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:4 
回复 3楼 李晨经纪人
for给的种子是固定的?不是说每次给的值不一样,种子就不同吗?
2018-02-22 18:21
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:4 
用时间做种子
#include <time.h>
srand(time(0));
srand是一个随机数计算公式,给相同的初始值计算结果一样。
2018-02-22 18:37
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 5楼 花脸
我是说每次运行程序for给的都是同一个序列:2 3 4 5 6 ...

[此贴子已经被作者于2018-2-23 12:52编辑过]

2018-02-22 18:47
木下瞳
Rank: 1
等 级:新手上路
帖 子:37
专家分:6
注 册:2017-9-24
收藏
得分:0 
回复 7楼 李晨经纪人
给你发私信了,然后我想问的是srand(c+2),这个是什么表示??
2018-02-23 01:28
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:4 
程序不停重复执行所输出结果应该是一样的,因为你的srand种子每次执行都一样,序列为:2,3,4,5,6,7,8,9,10,11。因此推算出产生的随机结果也基本一样。
对于srand来说,种子最好是唯一不重复的数,可理解为偏移量,于是人们就想到了用时间来作为偏移参数的合理性。需要注意的是,srand偏移量的生成只要一次则可,如放在循环里,如下代码所示:
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
    int c;
    for(c = 0;c < 10;c++)
    {
        srand(time());    //假如for循环每次执行需要1秒,而启动时假设得出为2的偏移量,那么其实就与题主的代码无区别了。
        printf("%d ",rand()); 
    }
}


所以,执行time()的目的不单单放眼在目前的运行上,还放眼在程序交付使用时的情况。(除非同一时间内,程序在2个机器同时被使用,才有可能得出相同的种子,但不同机器的rand结果视乎机器内存情况,所以time基本足够安全了)
注:这些只是本人的理解,没有去证实内里是否为实,因此不能尽信,要保持怀疑与求解的精神,如发现有错误之处,望无嫌指正,谢谢。

另外:其实我也想查查srand的实现原理,但基于百毒出的信息过多而且不合要求,故偷懒地在这希望有高人出来说说srand的运作原理,以解本人的困惑。

[此贴子已经被作者于2018-2-23 13:20编辑过]

2018-02-23 13:12
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
回复 8楼 木下瞳
srand()里面的参数是unsigned int型,既能是变量也可以是常量。c+2是个变量表达式,通过表达式的值影响系统提供的种子值。一样的表达式值对应一样的种子,一样的种子rand()出来的伪随机序列也一样。举例:在我的电脑上c=2,srand(c+1);与srand(3)一样对应rand()的伪随机序列固定就是48 7196 9294 9091 7031...。
2018-02-23 13:44
快速回复:哪位大牛,给我解释一下这个代码(随机数)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044130 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved