也談生成不重複數的演算法

2022-01-13 15:21:21 字數 2278 閱讀 2493

剛剛看到有人寫生成不重複的隨機數的三種方法

,正好在幾年前我也有過類似的要求,實現類似於雙色球隨機選號的功能,也就是在m個數中選取n個不重複的數(m>n>0),下面我也談談我曾經用過的幾種做法,也算是對作者提出的方法的一種補充吧。

一、利用contains()判斷法

思路是每次在制定範圍中隨機生成乙個隨機數,然後判斷在已經生成的集合中是否存在,如果不存在就新增到結果集合中去,**如下:

public

static

list

<

int>

generaterandomnumber1()

}return

result;

}這種做法的缺點是效率比較低,因為不是每一次迴圈生成的隨機數都是有效地,特別是當m和n接近時,這種演算法的缺點極其明顯。

二、刪除法

這種做法的實現過程時實現將所有可能的值填充到乙個容器集合中,每次隨機從這個容器集合中取乙個值出來放到結果集合中,並且從容器集合中刪除這個已經用過的值,再進行下一次迴圈,從容器集合中取乙個隨機值,**如下:

public

static

list

<

int>

generaterandomnumber2()

for(

inti =1

; i 

<=

count; i++)

return

result;

}這種做法的優點是每次迴圈都能生成乙個「有效」的隨機數(指不會與現有的重複),缺點是需要先初始化所有可能的隨機數容器集合。

三、調換位置法

這種演算法的特點是使用陣列,先初始化乙個包含所有可能值的容器集合,然後再初始化乙個存放結果的陣列,每次從容器集合中隨機取乙個數出來用結果陣列存放,然後在容器集合中調整鋼材使用的那個數的位置,使它放在不適用的範圍中(即標識為不再使用),下次再從容器集合中的所有標識為可用的數中隨機取乙個出來,**如下:

public

static

int generaterandomnumber3()

for(

inti =0

; i 

<

count; i++)

return

result;

}這種做法的優點也是不用每次判斷選擇的數是否在結果中是否存在,並且使用的陣列,原理適用於不支援泛型集合的語言(如php等),缺點也是要先初始化所有可能值的容器集合。

總結,對於我個人來說,我比較傾向於後兩種方法,因為不用去判斷隨機選擇的數是否已經在結果集合中存在的情況,缺點也是這個,它需要在每次初始化容器集合(不過這個缺點也是它的優點,這種情況也可以應用於在指定範圍的所有可能型別的集合中隨機選擇幾個不重複的場合)。

最後,因為因為有其它事情,所以表達方式可能不是很清楚,請大家看看**。

下面提供乙個可執行的版本,**如下:

using

system;

using

system.collections;

using

system.collections.generic;

namespace

class

program

}public

static

list

<

int>

generaterandomnumber1()

}result.sort();

return

result;

}public

static

list

<

int>

generaterandomnumber2()

for(

inti =1

; i 

<=

count; i++)

return

result;

}public

static

int generaterandomnumber3()

for(

inti =0

; i 

<

count; i++)

array.sort(result);

return

result;

}private

static

void

showresult(ilist

<

int>

list)

console.writeline(list[list.count -1

] +"]

");}}

}

演算法 隨機不重複數列生成

今天上班的時候網上看到題目很簡單,題目是這樣的 給定乙個正整數n,需要輸出乙個長度為n的陣列,陣列元素是隨機數,範圍為0 n 1,且元素不能重複。比如 n 3 時,需要獲取乙個長度為3的陣列,元素範圍為0 2 簡單的理解就是生成乙個無序的隨機數組,在路上想了一下回來用三種方式方式實現了一下 oc實現...

一種生成不重複數的演算法

在程式設計中經常遇到一些類似的問題,比如做乙個雙色球選號軟體,其中6個雙色球是從1到33之間選出6個數來,這6個數是不能重複的,這個問題就是我們今天要說的生成不重複數演算法。演算法描述如下 從m個數中選出n個數來 0下面要介紹的演算法是,每次隨機取出乙個數,之後將該數放置到集合的末尾去,這樣下次取隨...

一種生成不重複數的演算法

在程式設計中經常遇到一些類似的問題,比如做乙個雙色球選號軟體,其中6個雙色球是從1到33之間選出6個數來,這6個數是不能重複的,這個問題就是我們今天要說的生成不重複數演算法。演算法描述如下 從m個數中選出n個數來 0下面要介紹的演算法是,每次隨機取出乙個數,之後將該數放置到集合的末尾去,這樣下次取隨...