程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c/C++中隨機數的設置

c/C++中隨機數的設置

編輯:關於C++

random和rando多可以產生隨機數,包含在stdlib.h裡。

random函數不是ANSI C標准,不能在gcc,vc等編譯器下編譯通過。但在C語言中int random(num)可以這樣使用,它返回的是0至num-1的一個隨機數。 可改用C++下的rand函數來實現。

1、C++標准函數庫提供一隨機數生成器rand,返回0-RAND_MAX之間均勻分布的偽隨機整數。 RAND_MAX必須至少為32767。rand()函數不接受參數,默認以1為種子(即起始值)。 隨機數生成器總是以相同的種子開始,所以形成的偽隨機數列也相同,失去了隨機意義。(但這樣便於程序調試)

2、C++中另一函數srand(),可以指定不同的數(無符號整數變元)為種子。但是如果種子相同,偽隨機數列也相同。一個辦法是讓用戶輸入種子,但是仍然不理想。

3、比較理想的是用變化的數,比如時間來作為隨機數生成器的種子。 time的值每時每刻都不同。所以種子不同,所以,產生的隨機數也不同。

rand運用問題與解答:

問:為什麼有時rand()用它都是同一個數?如何產生一個真正隨機數?

答:之所以rand()每次的隨機數都一樣是因為rand()函數使用不正確。各種編程語言返回的隨機數(確切地說是偽隨機數)實際上都是根據遞推公式計算的一組數值,當序列足夠長,這組數值近似滿足均勻分布。如果計算偽隨機序列的初始數值(稱為種子)相同,則計算出來的偽隨機序列就是完全相同的。這個特性被有的軟件利用於加密和解密。加密時,可以用某個種子數生成一個偽隨機序列並對數據進行處理;解密時,再利用種子數生成一個偽隨機序列並對加密數據進行還原。這樣,對於不知道種子數的人要想解密就需要多費些事了。當然,這種完全相同的序列對於你來說是非常糟糕的。要解決這個問題,需要在每次產生隨機序列前,先指定不同的種子,這樣計算出來的隨機序列就不會完全相同了。你可以在調用rand()函數之前調用srand( (unsigned)time( NULL ) ),這樣以time函數值(即當前時間)作為種子數,因為兩次調用rand函數的時間通常是不同的,這樣就可以保證隨機性了。你也可以使用srand函數來人為指定種子數。Windows 9x/NT的游戲FreeCell就允許用戶指定種子數,這樣用戶如果一次游戲沒有成功,下次還可以以同樣的發牌結果再玩一次。

例子:

以下為引用的內容:

#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <time.h>
void main()
{

srand( (unsigned)time( NULL ) ); //注意不要放在for循環裡,否則產生的數是同一個數。
for(int i=0;i<100000;i++)
{

cout<<rand()<<endl;
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved