計算機能不能產生真正意義上的產生隨機數

2021-03-22 08:14:01 字數 6310 閱讀 3255

1樓:曉風殘月清楊柳

問:怎樣產生隨機數?

答: 在計算機中並沒有一個真正的隨機數發生器,但是可以做到使產生的數字重複率很低,這樣看起來好象是真正的隨機數,實現這一功能的程式叫偽隨機數發生器。

有關如何產生隨機數的理論有許多,如果要詳細地討論,需要厚厚的一本書的篇幅。不管用什麼方法實現隨機數發生器,都必須給它提供一個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。

「種子」的值通常是用快速計數暫存器或移位暫存器來生成的。

下面講一講在c語言裡所提供的隨機數發生器的用法。現在的c編譯器都提供了一個基於ansi標準的偽隨機數發生器函式,用來生成隨機數。它們就是rand()和srand()函式。

這二個函式的工作過程如下:

1) 首先給srand()提供一個種子,它是一個unsigned int型別,其取值範圍從0~65535;

2) 然後呼叫rand(),它會根據提供給srand()的種子值返回一個隨機數(在0到32767之間)

3) 根據需要多次呼叫rand(),從而不間斷地得到新的隨機數;

4) 無論什麼時候,都可以給srand()提供一個新的種子,從而進一步「隨機化」rand()的輸出結果。

這個過程看起來很簡單,問題是如果你每次呼叫srand()時都提供相同的種子值,那麼,你將會得到相同的隨機數序列,這時看到的現象是沒有隨機數,而每一次的數都是一樣的了。例如,在以17為種子值呼叫srand()之後,在首次呼叫rand()時,得到隨機數94。在第二次和第三次呼叫rand()時將分別得到26602和30017,這些數看上去是很隨機的(儘管這只是一個很小的資料點集合),但是,在你再次以17為種子值呼叫srand()後,在對於rand()的前三次呼叫中,所得的返回值仍然是在對94,26602,30017,並且此後得到的返回值仍然是在對rand()的第一批呼叫中所得到的其餘的返回值。

因此只有再次給srand()提供一個隨機的種子值,才能再次得到一個隨機數。

下面的例子用一種簡單而有效的方法來產生一個相當隨機的「種子」值----當天的時間值

2樓:匿名使用者

產生的隨機數字與你當時的時間有關 因為你當時的時間永遠都是不一樣的 所以得到的隨機數字也不一樣

為什麼說計算機(電腦)無法產生真正意義上的隨機數

電子計算機不能產生真正意義的隨機數,那量子計算機能嗎?

3樓:匿名使用者

電子計算機不能產生真隨機數的原因是由於其由各種隨機種子決定而隨機種子的界定是必然 故屬於偽隨機

理論上 量子計算機可以產生真隨機數

因為本質上量子現象就具備了不確定性

當然這種不確定只是在當下 但在未來誰也不知道能否完美**量子現象所以量子計算機產生真隨機數只在當下成立

另外 量子計算機產生真隨機數使用的發生器並不是很容易完成的

電腦是否能產生真隨機數?

4樓:元戎劍

目前由計算機產生的所有所謂的隨機數都是偽隨機數.

採用隨機變化的種子再產生偽隨機數,得到的結果更隨機些,但它還是偽隨機數. 因為如果重複這個過程(給同樣值的種子),得到的結果是重複的(同樣的).

如果不採用隨機變化的種子,單用rand(),它只會產生固定的序列.例如: for(i=0;i<10;i++)printf("%d ",rand()); 每次執行輸出的還是那十個數.

談隨機數的分佈,涉及統計的概念,統計的前提是要有大量的樣品.做到大量樣品的分佈滿足某種分佈(包括均勻分佈或某種譜分佈),演算法上是不困難的.

我們在實驗室裡模擬天然海浪,讓海浪符合設定的頻譜和方向譜,還要滿足波高和週期的時域統計分佈,還有波群統計相似,單靠計算機提供的偽隨機數是不夠的,須要加上自己的演算法,才能同時滿足頻域和時域的要求.

"我只要知道偽隨機數用的是哪種演算法,就能準確的知道下一個數將是什麼",是對的,例如用時間做種子,你只要給入同樣的時間,就能得到同樣的結果.

5樓:陽光上的橋

隨機數是不可能的,都是偽隨機數。

但是隨機數與你說的摩擦、碰撞有關係嗎?

6樓:

計算機可以生成真隨機數,這是由於其在進行硬體驅動時,不可避免的受到不確定因素的影響而產生隨機性,例如計算機至少需要顯示驅動和發聲驅動吧,體現在計算機程式語言上就是涉及顯示卡驅動和音效卡驅動的程式設計函式有的執行時間是隨機的,即使你連續呼叫這些函式執行時間也是變化的,利用這些就可以生成真隨機數了。其它方法也不少就不多說了。

我突然有個想法:如果我們能使計算機產生真正意義上的隨機數,那麼不就意味著我們能夠做出人工智慧?

7樓:匿名使用者

你能想到的,國外科學家早就想在你前面了。不然人家怎麼會成功。

8樓:dawn1999巨蟹

問題是理論上來說用程式所產生的數都不是真正意義上的隨機數

9樓:中二病患嚴重

要產生隨機數也得需要固定程式,人工智慧只是人想要模仿上帝的可笑贗品而已

計算機程式可以產生真正的隨機數嗎?不是random偽隨機

10樓:匿名使用者

光靠程式是無法實現真隨機數的。要實現真正的隨機數,必須有真正隨機的種子。

計算機是怎麼產生隨機數的?

11樓:匿名使用者

rnd函式實際上一個bai一個的返回已經du定zhi義好的數列中的項dao。執行

回rnd之前,必須執行randomize才有意義。

答否則每次都會從第一項開始返回那個vb定義好的「隨機」數列。

比如,如果你不初始化(randomize)隨機數,每次新執行程式後,使用rnd就會返回如下數列:

.7055475

.533424

.5795186

.2895625

.301948

.7747401

1.401764e-02

.7607236

.81449

.7090379

……randomize的原理就是,利用當前時間(timer屬性)作為「種子」(為初始值,用來生成偽隨機數字。例如, randomize 語句建立一種子值供 rnd 函式使用,以接著建立唯一偽隨機數列。),初始化rnd函式所使用的那個數列,才能真正意義上產生隨機數。

計算機為什麼不能產生真正的隨機

12樓:布蘭登_詹寧斯

在計算機、通訊系統中我們採用的隨機數、隨機碼均為偽隨機數、偽隨機碼。所謂「隨機碼」,就是無論這個碼有多長都不會出現迴圈的現象,而「偽隨機碼」在碼長達到一定程度時會從其第一位開始迴圈,由於出現的迴圈長度相當大,例如cdma採用42的偽隨機碼,重複的可能性為4.4萬億分之一,所以可以當成隨機碼使用。

c語言怎樣產生一定範圍的隨機數?

13樓:hk_孤獨的心

編譯環境為:vs2013

產生1到3的整型隨機數的**如下:

#include

#include

#include

#define max 3   //這個函式的意義為:隨機生成最大的數為3

#define min 1    //這個函式的意義為:隨機生成最小的數為1

int main()

14樓:愛夏的你呀

在c語言中,rand()函式可以用來產生隨機數,但是這不是真真意義上的隨機數,

是一個偽隨機數,是根據一個數,可以稱它為種子。

為基準以某個遞推公式推算出來的一系數,當這系列數很大的時候,就符合正態公佈,從而相當於產生了隨機數。

c語言產生一定範圍的隨機數的源**如下:

#include

#include

int main()

return 0;

}擴充套件資料

1、如果要隨機生成一個在一定範圍的數,你可以在巨集定義中定義一個random(int number)函式,然後在main()裡面直接呼叫random()函式。

2、在對rand()的前三次呼叫中,並且此後得到的返回值仍然是在對rand()的第一批呼叫中所得到的其餘的返回值。因此,只有再次給srand()提供一個隨機的「種子」值,才能再次得到一個隨機數。

15樓:匿名使用者

c語言的獲取隨

機數的函式為rand(), 可以獲得一個非負整數的隨機數。要呼叫rand需要引用標頭檔案stdlib.h。

要讓隨機數限定在一個範圍,可以採用模除加加法的方式。

要產生隨機數r, 其範圍為 m<=r<=n,可以使用如下公式:

rand()%(n-m+1)+m

其原理為,對於任意數,

0<=rand()%(n-m+1)<=n-m於是0+m<=rand()%(n-m+1)+m<=n-m+m即m<=rand()%(n-m+1)+m<=n

16樓:哇哎西西

利用srand((unsigned int)(time(null))是一種方法,因為每一次執行程式的時間是不同的。

在c語言裡所提供的隨機數發生器的用法:現在的c編譯器都提供了一個基於ansi標準的偽隨機數發生器函式,用來生成隨機數。它們就是rand()和srand()函式。

這二個函式的工作過程如下:

1) 首先給srand()提供一個種子,它是一個unsigned int型別,其取值範圍從0~65535;

2) 然後呼叫rand(),它會根據提供給srand()的種子值返回一個隨機數(在0到32767之間)

3) 根據需要多次呼叫rand(),從而不間斷地得到新的隨機數;

4) 無論什麼時候,都可以給srand()提供一個新的種子,從而進一步「隨機化」rand()的輸出結果。

下面是0~32767之間的隨機數程式:

#include

#include

#include // 使用當前時鐘做種子

void main(void)

根據上面的程式可以很容易得到0~1之間的隨機數:

#include

#include

#include

int main( )

而產生1~100之間的隨機數可以這樣寫:

#include

#include

#include

int main( )

17樓:溫柔_儂渲芷

srand((int)time(null));設定隨機數種子

rand()%100;產生0-99的隨機數。高階點的,假如要產生16-59之間的數,你可以這樣寫:rand()%44+16(這裡44由59-16+1得到)。其他情況如法炮製!

下面是搜回來的:

問題1: 怎樣獲得一個真正的隨機數?要知道,rand()是不能產生真正的隨機數的!即使不能產生真正的隨機數,也要大概接近呀!而rand()好象每次的隨機都一樣。

專家解答:

之所以rand()每次的隨機數都一樣是因為rand()函式使用不正確。各種程式語言返回的隨機數(確切地說是偽隨機數)實際上都是根據遞推公式計算的一組數值,當序列足夠長,這組數值近似滿足均勻分佈。如果計算偽隨機序列的初始數值(稱為種子)相同,則計算出來的偽隨機序列就是完全相同的。

這個特性被有的軟體利用於加密和解密。加密時,可以用某個種子數生成一個偽隨機序列並對資料進行處理;解密時,再利用種子數生成一個偽隨機序列並對加密資料進行還原。這樣,對於不知道種子數的人要想解密就需要多費些事了。

當然,這種完全相同的序列對於你來說是非常糟糕的。要解決這個問題,需要在每次產生隨機序列前,先指定不同的種子,這樣計算出來的隨機序列就不會完全相同了。你可以在呼叫rand()函式之前呼叫srand( (unsigned)time( null ) ),這樣以time函式值(即當前時間)作為種子數,因為兩次呼叫rand函式的時間通常是不同的,這樣就可以保證隨機性了。

你也可以使用srand函式來人為指定種子數。windows 9x/nt的遊戲freecell就允許使用者指定種子數,這樣使用者如果一次遊戲沒有成功,下次還可以以同樣的發牌結果再玩一次。

問題2: 我按照上述方法並不能產生隨機數,僅產生公差為3或4的等差數列:

請採納答案,支援我一下。

學計算機專業的能不能學建築設計這塊

額。我就是建築學的,基礎很重要,先從手繪開始練練吧,素描水粉鋼筆畫馬克筆用法。而且電腦繪圖也很重要,cad.3dmax.都是你找工作要用的。還是先從基礎練起。制定個計劃比較好。建築設計比較注重個人的美學修養,我是這樣認為的。所以要學習建築設計,我覺得要把手繪的功底打好,學學素描,色彩,建築速寫這一類...

文科生能不能學習計算機專業,關於文科生能不能報計算機專業的問題

可以。本科教覆育對制 基礎要求不強,只要努力就可以 大學招生對高中時所需文科或者理科無要求,只要喜歡就可報 計算機學科也是綜合性學科,很多計算機大師也並不是學習計算機出身,所以文科生完全可以學習計算機專業。要事先打聽好學校的轉專業要求,最好不要太高,而且要文理通轉的那種,我專看到的一般大學 屬計算機...

海南大學電腦科學宇技術專業學生能不能提早畢業

修夠學分就可以提前畢業!如果你不想那麼快離開學校還可以輔修其他專業 輔修其他證 加入社團,個人覺得沒什麼用.除非你當的職位比較大但是也不是絕對的!有弊必有利 在大學主要是學到東西!修夠學分肯定可以提前畢業,但是一般提前畢業還是需要在大三的時候,畢竟這麼多的課程,你不可能大一大二就可以提前修完的,我是...