| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1605 人关注过本帖
标题:用rand( )的奇怪现象
只看楼主 加入收藏
cmx2409
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2008-11-10
收藏
 问题点数:0 回复次数:6 
用rand( )的奇怪现象
用rand()输出10个随机数(这10个随机数的范围在1-10之间)
代码如下:
#include<iostream>
using namespace std;
#include<time.h>
int main()
{
    int i;
    srand((unsigned)time(NULL));
    for(i=0;i<10;i++)
    {
        cout<<1+(int)(10.0*rand()/(RAND_MAX+1.0))<<" ";
    }
    cout<<endl;
        return 0;
}
我连续运行几次结果如下:
9 5 2 9 1 10 10 1 6 10
Press any key to continue
9 2 3 4 7 3 1 9 6 6
Press any key to continue
9 2 10 6 7 6 4 7 1 1
Press any key to continue
--------------------------------------------------------------------------------------------------------------------------
我发现在产生的第一个数都是一样的,于是对代码做如下改动:
将原来的“cout<<1+(int)(10.0*rand()/(RAND_MAX+1.0))<<" "; ”
改为“cout<<1+(int)(10.0*rand()/(RAND_MAX+1.0))<<" "<<rand()<<" ";”
连继几次运行结果如下;
8 30867 3 15363 4 25193 1 4540 9 9588 6 10727 9 11060 6 15548 1 1345 1 15649
Press any key to continue
2 30850 6 24346 8 6389 6 21745 8 25334 6 11466 4 31438 9 2891 3 31095 5 6495
Press any key to continue
5 30834 9 561 2 20352 10 6183 8 8312 6 12206 8 19048 3 23003 4 28077 9 30109
Press any key to continue
这回第一个数不同了,但是根据后面的随机数并按“1+(int)(10.0*rand()/(RAND_MAX+1.0))”计算的话,前面的1-10之间的数并不正确
---------------------------------------------------------------------------------------------------------------------------
再做实验,代码如下:
#include<iostream>
using namespace std;
#include<time.h>
int main()
{
    int i;
    srand((unsigned)time(NULL));
    for(i=0;i<10;i++)
    {
        cout<<1+(int)(10.0*rand()/(RAND_MAX+1.0))<<" ";
    }
    cout<<endl;
    for(i=0;i<10;i++)
    {
        cout<<1+(int)(10.0*rand()/(RAND_MAX+1.0))<<" "<<rand()<<" ";
    }
    cout<<endl;
    return 0;
}
连续几次运行结果如下:
1 5 1 7 5 9 9 7 8 2
6 30130 1 14232 10 26183 6 31074 1 21586 8 14874 9 3277 9 7596 8 15158 4 21679
Press any key to continue
1 1 4 2 8 10 5 1 3 10
6 27615 7 30144 10 10234 2 28228 4 19940 8 12329 5 29153 6 26471 3 16956 10 27719
Press any key to continue
1 4 9 9 1 1 6 1 9 8
6 27467 2 19515 6 32426 7 22278 1 21771 3 23745 7 11400 9 8306 8 5496 6 4944
Press any key to continue
1 10 10 4 8 3 8 9 9 5
6 27172 2 31025 6 11274 8 10378 5 25432 3 13808 2 8661 6 4744 8 15345 9 24930
Press any key to continue
这回第一个数又相同了

请高手帮忙解释下
搜索更多相关主题的帖子: rand 
2008-11-12 22:35
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:0 
别搞迷信,随机数就是随机数,就算是一样也是随机数,何况它们并不一样,只是运算过后的数值是一样的.
2008-11-15 19:59
cmx2409
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2008-11-10
收藏
得分:0 
MSDN中不是说了么..rand( )产生的是伪随机数..

Remarks
The rand function returns a pseudorandom integer in the range 0 to RAND_MAX. Use the srand function to seed the pseudorandom-number generator before calling rand.

今天我又连续运行了几次第一个程序,第一个数虽然不是9,但都是2开头的
还有就是第二个程序中,根据后面的随机数并按“1+(int)(10.0*rand()/(RAND_MAX+1.0))”计算的话,前面的1-10之间的数并不正确.这是为什么 如:
30867 按“1+(int)(10.0*rand()/(RAND_MAX+1.0))”计算,前面应该是10啊,而不是8
2008-11-15 20:27
cmx2409
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2008-11-10
收藏
得分:0 
MSDN中不是说了么..rand( )产生的是伪随机数..

Remarks
The rand function returns a pseudorandom integer in the range 0 to RAND_MAX. Use the srand function to seed the pseudorandom-number generator before calling rand.

今天我又连续运行了几次第一个程序,第一个数虽然不是9,但都是2开头的
还有就是第二个程序中,根据后面的随机数并按“1+(int)(10.0*rand()/(RAND_MAX+1.0))”计算的话,前面的1-10之间的数并不正确.这是为什么 如:
30867 按“1+(int)(10.0*rand()/(RAND_MAX+1.0))”计算,前面应该是10啊,而不是8
2008-11-15 20:32
沼泽
Rank: 4
等 级:业余侠客
威 望:8
帖 子:291
专家分:228
注 册:2008-9-15
收藏
得分:0 
srand((unsigned)time(NULL));设置的随机数种子,你每次运行程序时时间间隔不会很大,所以for循环中第一次调用rand()产生的随机值相差的不会很大,
     用1+(int)(10.0*rand()/(RAND_MAX+1.0))后,将随机数放大10倍再除以(RAND_MAX+1.0),得到数的差异会更小,导致每次的值都一样,所以你第一次连续几次运行结果的第一个数都是9
     而你过了一天又运行程序由于系统时间变化很大,所以srand((unsigned)time(NULL));的种子的差异会很大,因此for循环中第一次调用rand()产生的随机值会与你以前的相差很大,所以又变成了2
     如果你想得到每次循环的第一个数的值不同,可以将每次设置的随机数种子放大,比如srand(    (unsigned)time(NULL)*1000    );那得到的值的差异会很大了

[[it] 本帖最后由 沼泽 于 2008-11-16 19:15 编辑 [/it]]
2008-11-16 19:12
xmnathan
Rank: 2
等 级:论坛游民
威 望:1
帖 子:73
专家分:10
注 册:2008-8-30
收藏
得分:0 
没有初始化随机种子而已罢

要取1~10之间数的话
1+rand()%10 不就好了?

[[it] 本帖最后由 xmnathan 于 2008-11-17 14:44 编辑 [/it]]

唉 好难
2008-11-17 14:41
cmx2409
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2008-11-10
收藏
得分:0 
谢谢5楼沼泽版主的指导..
也谢谢LS的哥们,看来还要多多思考啊
2008-11-17 18:30
快速回复:用rand( )的奇怪现象
数据加载中...
 
   



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

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