1. 程式人生 > >PHP高效生成一個不重複隨機數

PHP高效生成一個不重複隨機數

PHP高效產生m個n範圍內的不重複隨機數(m<=n)

注:在《 Programming Pearls 》一書中也有提到,題目為“如何高效產生m個n範圍內的不重複隨機數(m<=n)”

該演算法非常巧妙的取隨機數的位置(陣列的下標),替代取隨機數本身,每次取到一個隨機數之後,就將其在取值範圍中排除,下一次僅會在剩下的數字中取,一次遍歷就可以完成隨機數的選取,效率相當高。

  1. function rand_num($num='200'){
  2. for($i=0;$i<$num;$i++){
  3. $n[$i]= $i;
  4. }
  5. for($i=0;$i<$num;$i++){
  6. $rand = mt_rand
    ($i,$num-1);
  7. //陣列 隨機數交換下標
  8. if($n[$i]== $i){
  9. $n[$i]= $n[$rand];
  10. $n[$rand]= $i;
  11. }
  12. }
  13. }

1.第一步,為陣列的每個數字按其下標順序賦值,獲得一個 $num 個數字鍵值對應順序排列的陣列。

2.第二,開始取範圍[ i,$num-1 ]範圍內的隨機數$rand,並將獲取到的隨機數$rand作為陣列中當前位置 鍵i對應下標的值$rand,將陣列中 鍵$rand對應下標的值替換為 i,這其實就是陣列鍵值交叉互換。意義是,將已經生成的隨機數在取值範圍[ i,$num-1 ]中排除,下次會在剩下的數字中[ i+1,num-1 ]

取值。

3.第三,為避免重複取值,只在未改變的鍵值對中進行交替運算,即在原陣列順序排列 (鍵==值) 的位置進行交替運算。

4.結束。

順序排列陣列部分交換過程

如上圖,獲取10個隨機數部分試例。

相關推薦

PHP高效生成一個重複隨機數

PHP高效產生m個n範圍內的不重複隨機數(m<=n) 注:在《 Programming Pearls 》一書中也有提到,題目為“如何高效產生m個n範圍內的不重複隨機數(m<=n)” 該演算法非常巧妙的取隨機數的位置(陣列的下標),替代取隨機數本身,每次取到一個隨機數之後,就將其在取值範圍

python生成一個重複隨機數

import random list1 = [0,1,2,3,4,5,6,7,8,9] list2 = ['a','b','c','d','e','f','g','h','i','j','k'] num1 = random.sample(list1,4) num2 = random.sam

【Python】Python生成一個重複隨機list

在一個範圍內,生成一個固定元素個數的,不重複的隨機list. 錯誤方法 使用for迴圈逐一對生成每個值進行判斷,在有重複值的時候,不會被被新增.在需要生成多個隨機值的時候,容易出現輸出的結果比較少的情況.比如下面需要生成20個隨機值,可是一般輸出的都不到20. import ra

分享一個php產生重複隨機數

public function getrandnum($allsubnum,$rulesubnum) { $arr = array(); function thearr($arr,$allsubnum,$rulesubnum) { if(count($arr)<$rulesubnum){ $th

PHP 生成一定數量的重複隨機數

將隨機數存入陣列,再在陣列中去除重複的值,即可生成一定數量的不重複隨機數。 function unique_rand($min, $max, $num) {$count = 0;$return = array();while ($count < $num) {$r

生成一個重復的訂單號(php)

AS stat imp 不相信 ID ascii碼 ascii 刪除 UNC /** * 生成訂單號 * * 用uniqid獲取一個基於當前的微秒數生成的唯一不重復的字符串(但是他的前7位貌似很久才會發生變動,所以不用考慮可刪除),取其第8到13位。但是這個字符串裏面有英文

生成重複隨機數序列(Java)

從1到n之間抽取出k個不重複的隨機數,用Math.random()實現的話,可參照下面的程式碼。 int r = (int) (Math.random() * n), 生成下標,據此下標,去到numbers數組裡拿到隨機數。然後將numbers[r]的值設定成

[js][技巧]生成指定範圍指定個數的重複隨機數

今天偶然看到的 比如要生成 1-100範圍之內的10個不重複隨機數,程式碼就可以這麼寫 var arr = []; for (var i = 1; i <=100; i++) { arr.push(i); } arr.sort(

生成重複隨機數,自己寫的,嘿嘿

package 基礎演算法; import java.util.Arrays; public class radomNums { public static void main(String[] args){ int[] array=new int[8]; i

PHP產生重複隨機數的5個方法總結

方法一: <?php  $numbers = range (1,50);  //shuffle 將陣列順序隨即打亂  shuffle ($numbers);  //array_slice 取該陣列中的某一段  $num=6;  $result = a

PHP 產生重複隨機數的方法(一)

1.首先通過rand()函式獲取一個長度固定的陣列。 例如:$numbers = rand(6,50); 這條語句是可以產生6到50個數字,是按順序排列的。 接著我們需要打亂這個順序,產生45個無序的陣列成一個數組,這時就需要用到php中的shuffle()函式。 例如:s

mysql生成重複隨機數(unique number generation)

問題來源 業務中有時會遇到要生成不重複隨機數的情況,例如,新生成一個商品編號、房間編號、或者其他物品編號等。不願意採用表的自增索引 id,同時又希望新生成的編號是不重複的。 這就需要考驗mysql的隨機數功能了。 Solution mysql的rand函

生成一系列重複隨機數 及寫入檔案

為什麼要寫這個程式: 原因是這樣的,我在寫排序演算法時感覺自己輸入原資料輸入的好累,於是自己想了想決定讓電腦自己輸入,但是由隨機數輸入會有重複的,於是我做了一些修正,實現了: input:

sql 生成隨機數 以及重複隨機數

背景:想在表中隨機取10條記錄,讓取出來的資料不重複(表中必須是有個遞增列,且遞增從1開始間隔為1)。  資料表: CREATE TABLE testable  (  id INT  IDENTITY(1,1),  myname  NVARCHAR(1000),  insertedTime DATETIME

生成重複隨機數的方法 --抽獎問題等

問題描述: 給定一個n,一個m 要求在1 ~ n這n個數字中,生成m個不重複的隨機數。 思路: 生成隨機數大家都知道,C++中也提供了相關的函式——rand()。 但是問題中要求生成的是無重複的隨機數,這裡就需要對生成的隨機數進行去重操作了。 首選最

PHP 產生m個n範圍內的重複隨機數

PHP高效產生m個n範圍內的不重複隨機數(m<=n) 方法一: <?php for ($i=1;$i<=52;$i++) { $arr[]= $i; } shuffle($arr); print_r($arr); 方法二: 注:在《 Pro

C# Random 生成重複隨機數

名稱空間:System 表示偽隨機數生成器,一種能夠產生滿足某些隨機性統計要求的數字序列的裝置。 偽隨機數是以相同的概率從一組有限的數字中選取的。所選數字並不具有完全的隨機性,因為它們是用一種確定的數學演算法選擇的,但是從實用的角度而言,其隨機程度已足夠了。 偽隨機數的

ios 生成重複隨機數

一、先講下ios三種取隨機數的方法: 1.    srand((unsigned)time(0));  //不加這句每次產生的隨機數不變        int i = rand() % 5;   

C#中生成重複隨機數

如果只是生成一個隨機數,C#中的Random函式就足夠用了,但如果需要生產若干個隨機數,且這些數不能重複,就需要自己來寫相應的方法了。 1.使用List<int>來儲存隨機數,List.Contain方法來判斷生成的隨機數是否已經存在 以在1-10中取5個不重複

產生一組重複隨機數高效演算法

需要從 0 到 n 之間選 k 個不重複的陣列成一個序列。 最早我想的是用一個輔助陣列記錄之前已經產生的隨機數,如果當前產生的隨機數已經出現過就再重新隨機。 顯然這樣的實現效率是很低的,設想從10000個數中隨機產生10000個數的序列,當前面9999個數已