如何高效的生成不重複的隨機數

2021-06-17 16:48:24 字數 1811 閱讀 7030

背景:

有個存有1000個問題的題庫,用陣列numhastack存,現要從中隨機生成5道題。如果直接用隨機數生成函式rand(),然後把生成的題號存到陣列numgenerate中,會產生重複出現的問題。

參考我原來的博文:

1.最直接的解決辦法:

每隨機生成乙個數,就拿到陣列numgenerate中比較,如果存在,就重新rand,否則push到陣列中,知道陣列長度達到5.

這裡關鍵就是借助in_array()函式判斷num是否在array中。

<?php 

$numgenerate = array();

$max = 1000;

for($i = 0;$i < 5;$i++)

$numgenerate[$i] = $num;

}var_dump($numgenerate);

?>

2 用shuffle函式,把固定的陣列打亂,然後,選擇前5個即可

shuffle函式原理:

我寫的shuffle函式

<?php

$times = 100;

function my_shuffle()

return $arr;

}var_dump(my_shuffle());

shuffle實現最終版:

<?php 

$numhastack = array();

$numgenerate = array();

$max = 1000;

//better method: range(0,1000)

for($i = 0;$i <$max;$i++)

shuffle($numhastack);

for($i =0;$i < 5;$i++)

var_dump($numgenerate);

?>

3.借助於hashtable(相當於每個數都對應乙個flag)

,不到陣列numgenerate中比較,而是用while迴圈檢查hashtable[num] 的值是否為0(,沒去過是預設為0,取過則設為1),如果不為0,則重新生成num,知道hashtable[num] == 0;

<?php 

$hashtable = array();

$numgenerate = array();

$max = 1000;

for($i = 0;$i < 5;$i++)

$numgenerate[$i] = $num;

$hashtable[$num] = 1;

}var_dump($numgenerate);

?>

4.速度最快的演算法(不做比較,只做交換)

<?php

/***generate 5 random numbers from total 1000 without duplicate **

*/$min = 0;

$max = 1000;

$numhastack = array();

$numgenerate = array();

for($i= 0;$i <= $max;$i++)

var_dump($numhastack);

for($i = 0;$i < 5;$i++)

var_dump($numgenerate);

參考文獻:

特別鳴謝:張亞傑同學

生成不重複的隨機數

思想是用乙個陣列來儲存索引號,先隨機生成乙個陣列位置,然後把這個位置的索引號取出來,並把最後乙個索引號複製到當前的陣列位置,然後使隨機 數的上限減一,具體如 先把這100個數放在乙個陣列內,每次隨機取乙個位置 第一次是1 100,第二次是1 99,將該位置的數用最後的數 代替。int index n...

不重複隨機數生成

直接上 生成 0,total 的隨機數 最大隨機數 ilist private static ilistgetrandomsequence int total random random new random for var i listbase.count 1 i 0 i return listo...

高效產生不重複的隨機數

purpose 生成隨機的不重複的測試資料 1000w資料量,要保證生成不重複的資料量,一般的程式沒有做到。但,本程式做到了。include include include include include include define size 10000000 int num size void ...