1. 程式人生 > >用rand()和srand()產生為隨機數的方法

用rand()和srand()產生為隨機數的方法

標準庫<cstdlib>(被包含於<iostream>中)提供兩個幫助生成偽隨機數的函式:

函式一:int rand(void);
從srand (seed)中指定的seed開始,返回一個[seed, RAND_MAX(0x7fff))間的隨機整數。

函式二:void srand(unsigned seed);
引數seed是rand()的種子,用來初始化rand()的起始值。

可以認為rand()在每次被呼叫的時候,它會檢視:
1) 如果使用者在此之前呼叫過srand(seed),給seed指定了一個值,那麼它會自動呼叫
srand(seed)一次來初始化它的起始值。
2) 如果使用者在此之前沒有呼叫過srand(seed),它會自動呼叫srand(1)一次。

根據上面的第一點我們可以得出:
1) 如果希望rand()在每次程式執行時產生的值都不一樣,必須給srand(seed)中的seed一個變值,這個變值必須在每次程式執行時都不一樣(比如到目前為止流逝的時間)。
2) 否則,如果給seed指定的是一個定值,那麼每次程式執行時rand()產生的值都會一樣,雖然這個值會是[seed, RAND_MAX(0x7fff))之間的一個隨機取得的值。
3) 如果在呼叫rand()之前沒有呼叫過srand(seed),效果將和呼叫了srand(1)再呼叫rand()一樣(1也是一個定值)。

舉幾個例子,假設我們要取得0~6之間的隨機整數(不含6本身):

例一,不指定seed:
for(int i=0;i<10;i++){
ran_num=rand() % 6;
cout<<ran_num<<" ";
}
每次執行都將輸出:5 5 4 4 5 4 0 0 4 2

例二,指定seed為定值1:
srand(1);
for(int i=0;i<10;i++){
ran_num=rand() % 6;
cout<<ran_num<<" ";
}
每次執行都將輸出:5 5 4 4 5 4 0 0 4 2
跟例子一的結果完全一樣。

例三,指定seed為定值6:
srand(6);
for(int i=0;i<10;i++){
ran_num=rand() % 6;
cout<<ran_num<<" ";
}
每次執行都將輸出:4 1 5 1 4 3 4 4 2 2
隨機值也是在[0,6)之間,隨得的值跟srand(1)不同,但是每次執行的結果都相同。

例四,指定seed為當前系統流逝了的時間(單位為秒):time_t time(0):
#include <ctime>
//…
srand((unsigned)time(0));
for(int i=0;i<10;i++){
ran_num=rand() % 6;
cout<<ran_num<<" ";
}
第一次執行時輸出:0 1 5 4 5 0 2 3 4 2
第二次:3 2 3 0 3 5 5 2 2 3
總之,每次執行結果將不一樣,因為每次啟動程式的時刻都不同(間隔須大於1秒?見下)。

關於time_t time(0):

time_t被定義為長整型,它返回從1970年1月1日零時零分零秒到目前為止所經過的時間,單位為秒。比如假設輸出:
cout<<time(0);
值約為1169174701,約等於37(年)乘365(天)乘24(小時)乘3600(秒)(月日沒算)。

另外,關於ran_num = rand() % 6,

將rand()的返回值與6求模是必須的,這樣才能確保目的隨機數落在[0,6)之間,否則rand()的返回值本身可能是很巨大的。
一個通用的公式是:
要取得[a,b)之間的隨機整數,使用(rand() % (b-a))+ a (結果值將含a不含b)。
在a為0的情況下,簡寫為rand() % b。

最後,關於偽隨機浮點數:

用rand() / double(RAND_MAX)可以取得0~1之間的浮點數(注意,不同於整型時候的公式,是除以,不是求模),舉例:
double ran_numf=0.0;
srand((unsigned)time(0));
for(int i=0;i<10;i++){
ran_numf = rand() / (double)(RAND_MAX);
cout<<ran_numf<<" ";
}
執行結果為:0.716636,0.457725,…等10個0~1之間的浮點數,每次結果都不同。

如果想取更大範圍的隨機浮點數,比如1~10,可以將
rand() /(double)(RAND_MAX) 改為 rand() /(double)(RAND_MAX/10)
執行結果為:7.19362,6.45775,…等10個1~10之間的浮點數,每次結果都不同。
至於100,1000的情況,如此類推。

以上不是偽隨機浮點數最好的實現方法,不過可以將就著用用…

下面介紹一個通用的公式:

(((double) rand() /
    (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);

相關推薦

rand()srand()產生隨機數方法

標準庫<cstdlib>(被包含於<iostream>中)提供兩個幫助生成偽隨機數的函式: 函式一:int rand(void); 從srand (seed)中指定的seed開始,返回一個[seed, RAND_MAX(0x7fff))間的隨機整數。 函式二:void sran

C語言的rand()srand()產生隨機數方法總結

rand()會返回一隨機數值,範圍在0至RAND_MAX 間。在呼叫此函式產生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在呼叫時會自動設隨機數種子為1。srand()用來設定rand()產生隨機數時的隨機數種子。引數seed必須是個整數

C++—randsrand的用法(簡單易懂版)—產生隨機數

每天進步一點點,目標距離縮小點在C++中,可以使用rand()函式產生隨機數。(rand()函式的標頭檔案在<cstdlib>中)如果想產生在一定範圍內的數,可以用取餘的方法獲得。如想獲得0—100的數同樣的道理,如果想獲得100-200之間的數—————————

rand()srand()函式的用法

一、rand() rand()函式用來產生隨機數,但是,rand()的內部實現是用線性同餘法實現的,是偽隨機數,由於週期較長,因此在一定範圍內可以看成是隨機的。 rand()會返回一個範圍在0到RAND_MAX(32767)之間的偽隨機數(整數)。 在呼叫rand()函

tomcat添加管理後臺的戶名密碼(jenkins連接tomcat

fff spa ins con admin style 80端口 文件 scrip vim ./conf/tomcat-users.xml <role rolename="admin"/> <role role

randsrand的用法

 首先我們要對rand&srand有個總體的看法:srand初始化隨機種子,rand產生隨機數,下面將詳細說明。 rand(產生隨機數) 表頭檔案: #include<stdlib.h> 定義函式 :int rand(void) 函式說明 : 因為

QT訊號處理機制事件新增處理動作(點選按鈕顯示helloworld)

首先新建一個專案命名為“QtGuuitest3” 雙擊 "QtGuitest3.ui" 其中按鈕的名字是pushButton 多行文字框為plainTextEdit 在QtGuuitest3.h中新增 #pragma once #include &

C庫:randsrand的實現原理以及C庫中原始碼

一、rand和srand的使用示例 博主前言:對rand和srand函式使用熟練的人,這步可直接跳過不看。 1.程式碼示例1和執行結果 //只有rand,沒有srand生成隨機種子 #in

rand()srand()函式

srand 初始化隨機種子,rand 產生隨機數。 rand函式 標頭檔案: <stdlib.h> 定義函式:int rand(void) 函式功能:產生隨機數 函式說明:因為rand的內部實現是用線性同餘法做的,他不是真的隨機數,只不過是因為其週期

C++中隨機函式rand()srand()的用法

一、rand()   函式名:   rand     功   能:   隨機數發生器    用   法:   int rand(void);     所在標頭檔案: stdlib.h   函式說明 :                 rand()的內部實現是用線性同餘法做

rand srand函式

#include <ctime> srand(time(0)); rand()函式產生的是“偽”隨機數,它是由軟體做成m序列發生器輸出的。這個m序列發生器在初始狀態不變的情況也,產生的“序列”是相同的——比如說在某一種狀態(如0000...)下,它產生的序列是

C++中隨機函式rand()srand()的用法(函式講解)

一、rand()   函式名:   rand      功   能:   隨機數發生器    用   法:   int rand(void);     所在標頭檔案: stdlib.h   函式說明 :                 rand()的內部實現是用線

中的隨機數產生函式rand,random,srand,srandom的一些知識

1、int rand()產生一個從0到最大整數之間的一個隨機數,但是每次程式啟動後產生的隨機數在時間順序上都是一樣的。 如: #include <stdio.h> #include <stdlib.h> int main(){ while(1)

PHP獲取隨機數的函數rand()mt_rand()

max min target targe () 不定 效率 獲取 php rand()函數用戶獲取隨機數,具體用法如下: rand()可以設置0個參數或者兩個參數,如rand($min,$max),$min表示從XX開始取值,$max表示最大只能為XX 例如: &

JavaScript的三種對話框是通過調window對象的三個方法alert(),confirm()prompt()

使用 運行 clas 都是 class 結果 腳本 但是 files 第一種:alert()方法 alert()方法是這三種對話框中最容易使用的一種,她可以用來簡單而明了地將alert()括號內的文本信息顯示在對話框中,我們將它稱為警示對話框,要顯示的信息放置在括號內,該對

PHPAjax進行前後臺數據交互——以戶登錄

serial click ots 多網站 頁面 用戶註冊 index -s password 很多網站中都有用戶登錄系統,要完成用戶的註冊和登陸,就一定要用到前後臺的數據交互。在這裏以簡單的用戶註冊和登陸為例介紹一下前後臺交互的大致流程。 首先,我們來做一個簡單的登陸界

access數據庫裏面字段設置可以空值非必填的方法

修改 blog nbsp str src acc 設置 技術 常常 access數據庫中默認的一些字段值常常是不允許為空、必填的,結果容易造成在插入數據時缺少數據報錯無法插入,可以通過下方修改數據庫: access數據庫裏面字段設置可以為空值和非必填的方法

Makefile中怎樣調pythonperl文件自己提供須要的數據

print erl col shel ria 實例代碼 space shell eight Makefile中怎樣調用python和perl文件為自己提供須要的數據,利用print函數對外輸出數據 實例代碼例如以下 perl.pl #!/usr/bin/per

練習:編寫循環,讓戶輸入戶名密碼,如果空或者數字,則重新輸入

color while pla 密碼 b2b 如果 lap use 循環 編寫循環,讓用戶輸入用戶名和密碼,如果用戶為空或者數字,則重新輸入 while True: user = input(‘請輸入用戶:‘) .strip() # 用戶輸入 ,去掉兩邊

windowsSSHlinux同步文件&linux開啟SSH&ssh client 報 algorithm negotiation failed的解決方法之一

.com oot install .cn 導致 per 連接 pem 用戶 1、安裝、配置與啟動 SSH分客戶端openssh-client和openssh-server 如果你只是想登陸別的機器的SSH只需要安裝openssh-client(ubuntu有默認安裝,如果