我沒法理解這一點,這更隨機? 算法
rand()
要麼 數組
rand() * rand()
我發現它是一個真正的腦筋急轉彎,你能幫助我嗎? oracle
編輯: dom
直觀地,我知道數學答案將是它們一樣隨機,但我不由想到,若是你將二者相乘的話「運行隨機數算法」兩次,你會創造一些比隨機更隨機的東西它一次。 函數
咱們能夠經過使用Kolmogorov複雜度來比較關於隨機性的兩個數組。若是數字序列不能被壓縮,那麼它是咱們在這個長度上能夠達到的最隨機...我知道這種類型的測量更像是理論選項... 網站
正如其餘人已經指出的那樣,這個問題很難回答,由於咱們每一個人都有本身的隨機性 。 加密
這就是爲何,我強烈建議您花一些時間閱讀本網站以更好地瞭解隨機性: spa
回到真正的問題。 這個術語中沒有或多或少的隨機: code
二者都只是隨機出現 ! get
在這兩種狀況下 - 只是rand()或rand()* rand() - 狀況是相同的:在幾十億個數字以後,序列將重複(!) 。 它對於觀察者來講彷佛是隨機的,由於他不知道整個序列,但計算機沒有真正的隨機源 - 因此他也不能產生隨機性。
例如:天氣是隨機的嗎? 咱們沒有足夠的傳感器或知識來肯定天氣是否隨機。
實際上,當你想到它時rand() * rand()
比rand()
更不隨機。 這就是緣由。
基本上,奇數與偶數相同。 而且說0.04325是奇數,而且像0.388是偶數,0.4是偶數,0.15是奇數,
這意味着rand()
具備偶數或奇數十進制的平等機會 。
另外一方面, rand() * rand()
的賠率有點不一樣。 讓咱們說:
double a = rand(); double b = rand(); double c = a * b;
a
和b
都有50%的偶數或奇數的機率。 知道
意味着有75%的可能性是c
是偶數,而只有25%的可能性是奇數,使得rand() * rand()
的值比rand()
更可預測,所以隨機性更小。
「隨機」與「更隨機」有點像詢問哪一個零更零。
在這種狀況下, rand
是一個PRNG,因此不是徹底隨機的。 (事實上,若是已知種子,則能夠預測)。 將它乘以另外一個值使其再也不或多或少隨機。
真正的加密型RNG其實是隨機的。 經過任何類型的函數運行值都不能爲它添加更多的熵,而且可能極可能刪除熵,使其再也不隨機。
二者都不是「更隨機」。
rand()
根據僞隨機種子(一般基於當前時間,老是在變化)生成一組可預測的數字。 將序列中的兩個連續數字相乘可生成不一樣但一樣可預測的數字序列。
解決這是否會減小碰撞,答案是否認的。 它實際上會增長碰撞,由於在0 < n < 1
下將兩個數相乘。 結果將是較小的分數,致使結果偏向光譜的下端。
一些進一步的解釋。 在下文中,「不可預測的」和「隨機的」是指某人根據先前的數字猜想下一個數字的能力,即。 一個神諭。
給定種子x
,它生成如下值列表:
0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3, ...
rand()
將生成上面的列表,而且rand() * rand()
將生成:
0.18, 0.08, 0.08, 0.21, ...
兩種方法老是爲同一種子生成相同的數字列表,所以能夠經過oracle一樣預測。 可是若是你看兩個調用相乘的結果,你會看到它們都在0.3
之下,儘管在原始序列中分佈不錯。 因爲兩個分數相乘的影響,數字有誤差。 由此產生的數字老是較小,所以儘管仍然是不可預測的,但更多是碰撞。