2010-10-23 44 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; 
}