c++隨機亂數srand()和rand()
作者:宋紫紫云__ | 来源:互联网 | 2023-05-17 09:58
所謂的「偽隨機數」指的並不是假的隨機數,這裡的「偽」是有規律的意思。其實絕對的隨機數隻是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機數。計算機生成的偽隨機數既是隨機的又是有規律的——一
所謂的「偽隨機數」指的並不是假的隨機數,這裡的「偽」是有規律的意思。其實絕對的隨機數隻是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機數。計算機生成的偽隨機數既是隨機的又是有規律的 —— 一部份遵守一定的規律,一部份則不遵守任何規律。比如「世上沒有兩片形狀完全相同的樹葉」,這正點到了事物的特性 —— 規律性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 —— 規律性。從這個角度講,我們就可以接受這樣的事實了:計算機只能產生偽隨機數而不是絕對的隨機數。
C++中的標準庫(包含在中)提供兩個幫助生成偽隨機數的函數:rand()和srand()。
函數一:int rand(void);
從srand(seed)中指定seed開始,返回一個範圍介於[seed,RAND_MAX(0x7fff))的隨機整數
函數二:void srand(unsigned seed);
參數seed是rand()的隨機種子,即用來初始化rand()的起始值。
系統在調用rand()之前都會自動調用srand(),如果用戶在rand()之前曾調用過srand()給參數seed指定了一個值,那麼rand()就會將seed的值作為產生偽隨機數的初始值;而如果用戶在rand()前沒有調用過srand(),那麼rand()就會自動調用srand(1),即系統默認將1作為偽隨機數的初始值。
由上述可得知,如果希望rand()在每次程序運行時產生的值都不一樣,必須給srand(seed)中的參數seed指定一個變值,這個變值必須在每次程序運行時都不一樣(比如到目前為止流逝的時間);如果我們給seed指定的是一個定值,那麼每次程序運行的時候,rand()產生的隨機數都會一樣,只不過這個值是[seed,RAND_MAX(0x7fff))範圍中的一個隨機取得的值。
舉幾個例子說明一下,假設我們要取得0~6之間的隨機數(不包括6本身):
程序一(沒有指定seed的值):
for(int i=0;i<10;i++)
{
ran_num=rand()%6;
cout<}
每次運行程序一都將輸出: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<}
每次運行程序二都將輸出: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<}
每次運行程序三都將輸出:4 1 5 1 4 3 4 4 2 2,雖然值跟程序二不一樣,不過每次運行時的結果也都相同。
程序四(指定seed的值為當前系統流逝了的時間,單位為秒(time_t time(0))):
#include
……
srand((unsigned)time(0));
for(int i=0;i<10;i++)
{
ran_num=rand()%6;
cout<}
運行程序四的時候,第一次輸出:0 1 5 4 5 0 2 3 4 2,第二次輸出:3 2 3 0 3 5 5 2 2 3,... ...每次的運行結果都不一樣,因為每次啟動程序時的時刻都不同。
關於time_t time(0)
time_t 被定義為長整型,它將返回從1970年1月1日零時零分零秒到現在所經歷過的時間,單位為秒。比如輸出 cout<
推荐阅读
-
为了加速游戏,一提起汇编语言,大家也许会感到很神秘。其实如果你学起来就会发现,它并非想象中那样难。特别是内嵌汇编,由于它和C++紧密结合,使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来 ...
[详细]
蜡笔小新 2023-09-05 03:45:50
-
设计平面坐标点类,计算两点之间距离、到原点距离、关于坐标轴和原点的对称点等。在设计中,由于求距离、求对称点等操作对原对象不能造成任何改变,所以,将这些函数设计为常成员函数是合适的,能够避免数据成 ...
[详细]
蜡笔小新 2023-08-19 17:16:15
-
-
蜡笔小新 2023-08-17 20:29:12
-
ProblemDescriptionAninchwormisatthebottomofawellninchesdeep.Ithasenoughene ...
[详细]
蜡笔小新 2023-07-29 10:08:13
-
蜡笔小新 2023-06-18 12:12:19
-
解开一个困扰自己多时的小问题小序今天上班的时候问了一起工作的Sidney同学一个小问题,显然他是研究过了的,不过他当时没有给出我答案。这个问题着实困扰了我好长时间捏~~晚上吃的小葱蘸 ...
[详细]
蜡笔小新 2023-06-11 14:22:33
-
名字空间是为了防止名字污染在标准C++中引入的。它可以将其中定义的名字隐藏起来,不同的名字空间中可以有相同的名字而互不干扰,使用时用域操作符(::)来引用。namespace名字{ ...
[详细]
蜡笔小新 2023-06-09 16:44:01
-
问题描述:(3)读入一个C++程序,输入m、n两个数字,从第m行起的n行代码将作为注释使用(即在这些行前面加上””),新程序保存到另一个.cpp文件中,并在屏幕上显示处理过的程序, ...
[详细]
蜡笔小新 2023-06-05 18:50:07
-
如何解决《C++getline传递文件或cin》经验,为你挑选了1个好方法。 ...
[详细]
蜡笔小新 2023-05-28 21:00:29
-
如何解决《使用std::ostream作为打印函数的参数》经验,为你挑选了1个好方法。 ...
[详细]
蜡笔小新 2023-05-28 14:07:44
-
如何解决《将流绑定到自身》经验,为你挑选了1个好方法。 ...
[详细]
蜡笔小新 2023-05-25 08:57:08
-
如何解决《使用struct作为函数崩溃程序的返回值》经验,为你挑选了1个好方法。 ...
[详细]
蜡笔小新 2023-05-24 16:25:39
-
如下:#include<string>#include<iostream> ...
[详细]
蜡笔小新 2023-08-27 16:13:29
-
WIN7、VS2010(工程字符集为Unicode):源代码如下:CStringWline;rs是ODBC取得的结果集(有汉字),调试发现line能成功读取line.Form ...
[详细]
蜡笔小新 2023-08-07 20:05:07
-
#include<iostream>usingnamespacestd;#defineN4charboard[N][N];intcol[N]; ...
[详细]
蜡笔小新 2023-05-28 14:44:09
-