| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1149 人关注过本帖
标题:关于随机数....
只看楼主 加入收藏
nemozhang
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-6
收藏
 问题点数:0 回复次数:3 
关于随机数....
小弟我写了个函数用于生成多个随机数,并放入传入的数组中,但是该函数如果连续调用的话,生成的两组数完全一致,请问有哪位高手能指点偶一下呢???
代码如下:
void GetRamArray(long num,long *array,long MinVal,long MaxVal)
{      
    //num 数组元素个数,*array数组,随机数最大最小值MinVal,MaxVal

    srand((unsigned)time(NULL));      //尝试过timeGetTime()精确到毫秒了,结果还是一样的...
    long temp=MaxVal-MinVal;         //计算随机数区间
    std::set<long> s;
    std::set<long>::iterator it;
    while(1)
    {
        long r = rand() % temp;   
        s.insert(r+MinVal);     //利用set来保存已经产生的随机数,同时防止重复
        if(s.size() == num)
        {
            break;
        }
    }
    int i=0;
    for (it=s.begin();it!=s.end();++it,i=rand()%num)
    {
        if (array[i]==0)   //取出的数是已经从笑到大排好序的,所以要打乱顺序
        {
            array[i]=(*it);
        }
        else
        {
            it--;
        }        
    }
}
int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    long a[10]={0};
    GetRamArray(10,a,9,89);
    for (int i=0;i<10;i++)
    {
        printf("The %d is %d \n",i,a[i]);
    }
    long b[10]={0};
    GetRamArray(10,b,9,89);       
    for ( i=0;i<10;i++)
    {
        printf("The %d is %d \n",i,b[i]);
    }
    return 0;
}
搜索更多相关主题的帖子: 随机数 
2008-03-02 19:35
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
#include <set>
#include<stdlib.h>  
#include<ctime>
void GetRamArray(long num,long *array,long MinVal,long MaxVal)
{      
    //num 数组元素个数,*array数组,随机数最大最小值MinVal,MaxVal

     //尝试过timeGetTime()精确到毫秒了,结果还是一样的...
    long temp=MaxVal-MinVal;         //计算随机数区间
    std::set<long> s;
    std::set<long>::iterator it;
    while(1)
    {
        long r = rand() % temp;   
        s.insert(r);     //利用set来保存已经产生的随机数,同时防止重复
        if(s.size() == num)
        {
            break;
        }
    }
    int i=0;
    for (it=s.begin();it!=s.end();++it,i=rand()%num)
    {
        if (array[i]==0)   //取出的数是已经从笑到大排好序的,所以要打乱顺序
        {
            array[i]=(*it);
        }
        else
        {
            it--;
        }        
    }
}
int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    long a[10]={0};
    srand((unsigned)time(NULL));
    GetRamArray(10,a,9,89);
    for (int i=0;i<10;i++)
    {
        printf("The %d is %d \n",i,a[i]);
    }
    long b[10]={0};
    GetRamArray(10,b,9,89);      
    for ( i=0;i<10;i++)
    {
        printf("The %d is %d \n",i,b[i]);
    }
    return 0;
}

学习需要安静。。海盗要重新来过。。
2008-03-02 22:51
hfl
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-2-28
收藏
得分:0 
问题补充
srand是初始化随机种子
rand函数采用了从一个初始值开始计算,然后算出一个随机数的方法,这个初始值就叫“随机种子”,而随机数可以看作就是由它“种出来的”。如果不采用srand初始化这个种子,rand函数就默认会使用0作为第一次的随机种子(下次则使用上次的结果)。那么每次程序运行“种出来的”随机数也就相同。而要让种子不相同,最简单的方法之一就是提取程序运行到那一步时的系统时间做随机种子,这就是srand(time(0))的由来。
很奇怪在程序里每次调到srand((unsigned)time(NULL)); 时候种下的种子都是一样的,所以才会出现随机数都相同的现象。我是这样解决的
Sleep(1000);//每次种种子前先让当前时间延时1秒
srand((unsigned)time(NULL));
这样就可以了。
楼上那位兄弟是用的rand函数的默认种子0
如果还有别的方法或是知道了为什么srand((unsigned)time(NULL)); 每次取到的种子都一样,多谢把原因贴出来
2008-03-03 11:40
nemozhang
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-6
收藏
得分:0 
回复 2# ,3#的帖子
1楼的那位改的是对的,我只是看了些百度上搜索到方法就直接拿过来用了,没有多做研究,其实不初始化种子的的话,多次调用GetRamArray产生的数列也是不同的,我已经做过实验了。srand(time(0))的问题嘛,我觉得因为CPU运行的速度很快,两次调用的间隔的时间太短,导致生成的种子都是一样的。[bc03] 感谢二位哦!

2008-03-03 12:26
快速回复:关于随机数....
数据加载中...
 
   



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

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