2010-10-23 38 views
2

我想選擇10個隨機整數從0到99,我知道我可以使用:如何選擇範圍從10個不同的整數(0,99)

random.randint(a, b) 

但如何告訴randint()的我只想要不同的整數。

我是否必須在每次隨機生成之後檢查整數是否已經生成並再次調用該方法?這似乎不是一個最佳解決方案。

+0

@Felix:這是隨機的,它只是不* *均勻隨機了;) – 2010-10-23 21:09:26

+0

@Felix王:這是做有效的事。它被稱爲無需替換的抽樣。 – 2010-10-23 21:09:43

+0

@阿門,它應該仍然是統一的。不在範圍(0,99)上,而是在該組的10個元素組合上。 – aaronasterling 2010-10-23 21:15:06

回答

10
from random import sample 

sample(range(0, 100), 10) 
+2

如果你想使用大範圍,你可以使用'xrange ',如[文檔](http://docs.python.org/library/random.html#random.sample)中所述,以避免分配一大堆你不關心的數字。 – intuited 2010-10-23 21:51:37

+0

只需在這裏使用'xrange'。在這種情況下很難想到有任何理由使用'range'。 – 2010-10-23 22:37:53

+0

@Glenn Maynard:Python 3? – 2010-10-24 00:49:46

8

這裏的一般策略是獨立的語言。生成從0到99的100個條目的數組。從0到99中選擇一個隨機數,並將該位置的條目與位置0的元素進行交換。然後,從i到99連續選擇一個隨機數,其中i = 1到9並將該位置處的元素與元素i處的元素進行交換。你的10個隨機數字位於數組的前10個位置。

+2

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm – LukeH 2010-10-23 21:18:05

+0

@LukeH - 感謝您的參考。這實際上是Fisher-Yates就地洗牌的變種。 – tvanfosson 2010-10-23 21:21:27

1

這可能不是一個解決方案,取決於你將需要使用這個...但你有沒有想過把它分成10個不同的隨機數發生器?防爆。 0-9,10-19,20-29等等。我想這不是真正的「隨機」,因爲你指定了不同的範圍,並保證每個範圍有1個數字。我能想到的唯一的其他解決方案是獲得隨機整數列表,遍歷並檢查隨機數是否已經生成,如果是的話,再次運行random.randint()。

+0

我喜歡tvanfosson的解決方案比我的解決方案更好。 – 2010-10-23 21:15:19

0

這裏是一個獨立於語言的解決方案:

integer numbers[10]; 
for(integer i = 0; i < 10; i += 1) { 
    integer num = randomInteger(min = 0, max = (99 - i)); 
    boolean hasFoundDuplicate = false; 
    for(integer j = 0; j < i && hasFoundDuplicate == false; j += 1) { 
     if(numbers[j] == num) { 
      num = 99 + 1 - i + j; 
      hasFoundDuplicate = true; 
     } 
    } 
    numbers[i] = num; 
}