注册 登录
编程论坛 C++教室

想请问一个关于 C++ 产生随机数的问题,代码已完成,还有一点小麻烦。

yangfrancis 发布于 2014-05-25 22:32, 697 次点击
这是在网上看到的代码,我没有完全复制,但核心思想应该没有出入。这段代码以系统的时间作为srand()函数的种子,以此来产生一个随机数。只是不知道为什么每次执行时第一个随机数总是没有变化,并且永远是“上限-1”。也就是说,若在0~10之间取随机数,第一个产生的永远是9.到底为什么?望各位大侠解答。在此感谢。
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
double random(double start,double end)
{
    return start+(end-start)*rand()/(RAND_MAX+1.0);
}
int main()
{
    srand(unsigned(time(0)));
    for(icnt=1;icnt<=10;icnt++)
    {
        cout<<int(random(0,10))<<endl;//在1到10之间取随机数
    }
    return 0;
}
4 回复
#2
yangfrancis2014-05-25 22:50
刚才自己又测试了一下。发现第一个返回值不一定是“上限-1”,但在连续返回多次的情况下一定是一个固定值。请教是怎么回事,是否跟即时的系统时间有关系?
#3
harecn2014-05-25 23:29
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
     srand(unsigned(time(0)));
     int icnt;
     for(icnt=1;icnt<=10;icnt++)
        {
            cout<<int(rand()%10)<<endl;//在1到10之间取随机数
        }
 return 0;
}
#4
TonyDeng2014-05-25 23:48
計算機的隨機數是偽隨機數,是用一個算法生成的,衹要第一個數相同,那麽永遠得到同一個數列串。因此,要得到不同的數列串,就要用不同的第一個數,而這個數必須足夠“隨機”,通常使用時鐘,因爲計算機每次運行計算這第一個數的時刻未必會一樣,那是足夠隨機的。使用C庫的隨機數生成函數,必須用隨機數初始化算法的種子(即第一個數),方法如前所述,未必一定要用時鐘,用鍵盤按鍵、硬件中斷(消息)等,也是可以的,關鍵是獲得的數被視爲足夠隨機,不容易重複得到即可。
#5
yangfrancis2014-05-26 14:56
harecn的代码解决问题了,虽然还是不太明白原来的代码问题出在哪里,但随机性的问题算是解决了。谢谢各位。
1