生成一串隨機數的演算法 發牌問題

2021-06-04 01:18:15 字數 969 閱讀 9451

例子:從1-40之間隨機取出n個數值,返回乙個隨機數的陣列

這是乙個很常見的演算法,通常的做法是建立乙個陣列,從裡面取出第乙個數a,再取第二個數b,此時需要判斷b不等於a才行,否則就需要重新生成,再取出第三個數c,c不能等於a或者b,依次類推,越到後面,由於沒被選中的數字越少,就會不斷的生成隨機數,結果發現已經被生成過了,又不斷的被放回去,這樣效率肯定會有問題。

其實這是乙個發牌的問題,解決的方法也很簡單,只需要取出a後,將a和陣列下標1的數字和a對調,再次生成隨機數的時候,就別從下標1-40之間取,而是從2-40之間取值,得到b後,將下標2的數字和b對調。依次類推。這裡因為使用的vbs,所以其實是0-39下標。生成的結果就在陣列的0-n-1中。

'顯示輸入框,將輸入內容賦值給i

n = inputbox("請輸入n(6-40)",vbonlyok, "18")

dim arr1(39)

for i=0 to 39

arr1(i)=i+1

next

lngmax=39

lngtmp=lngmax

strdata=""

for i=0 to n-1

lngrand=rnd_integer(i,lngmax)

lngtmp=arr1(lngrand)

arr1(lngrand)=arr1(i)

arr1(i)=lngtmp

next

dim arr2()

redim arr2(n-1)

for i=0 to n-1

arr2(i)=arr1(i)

next

'得到乙個min和max之間的隨機數

function rnd_integer(min,max)

randomize

rnd_integer = int((max-min)*rnd()+min)

end function

這個例子很典型,留著做個參考吧

隨機數生成演算法

看到一些介紹隨機數生成演算法的文章,收集下來,有空深入了解下。c語言中偽隨機數生成演算法實際上是採用了 線性同餘法 具體的計算如下 xi xi 1 a c mod m 其中a,c,m都是常數 一般會取質數 當c 0時,叫做乘同餘法。srand 函式置的seed實際上會作為x0被代入上式中,然後每次呼...

隨機數生成演算法

這兩天沒事,就寫了寫數學課上老師說的那個 蒲豐投針實驗 的程式。接觸到了一些隨機數生成方面的東西,寫出來跟大家分享一下。對於計算機生成隨機數這個東西,以前有過一些淺顯的認識。只知道計算機不能生成真正的隨機數,只能用一定的方法來模擬隨機數,叫做偽隨機數。比如c語言裡面的rand 函式,就是乙個偽隨機數...

solitidy 生成隨機數演算法

引用fomo3d的空投機制就是這中演算法。以太坊 生成乙個5位的隨機數 uint256 winningnum uint256 keccak256 abi.encodepacked block.timestamp add block.difficulty add uint256 keccak256 a...