例子:從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...