Python随机函数从值列表中选择新项
我想在Python中从一组数值中随机获取一些数字。我试过使用random.choice()这个函数,但有时候它会连续返回相同的值。我希望每次都能从列表中返回新的随机值。Python中有没有什么函数可以实现这个功能呢?
3 个回答
0
如果你只是想避免连续出现相同的随机值,可以试试这个方法:
import random
def nonrepeating_rand(n):
''' Generate random numbers in [0, n) such that no two consecutive numbers are equal. '''
k = random.randrange(n)
while 1:
yield k
k2 = random.randrange(n-1)
if k2 >= k: # Skip over the previous number
k2 += 1
k = k2
测试:
for i,j in zip(range(25), nonrepeating_rand(3)):
print i,j
输出(例如):
0 1
1 0
2 2
3 0
4 2
5 0
6 2
7 1
8 0
9 1
10 0
11 2
12 0
13 1
14 0
15 2
16 1
17 0
18 2
19 1
20 0
21 2
22 1
23 2
24 0
你可以使用 nonrepeating_rand(len(your_list))
来获取你列表中不重复的随机索引。
0
这里有一个例子:
>>> random.sample(range(10), 10)
[9, 5, 2, 0, 6, 3, 1, 8, 7, 4]
只需要把用range生成的数字序列换成你想要的那个序列就可以了。第二个数字是你想要的样本数量,应该和输入序列的长度一致。
2
首先,创建一个列表的副本,然后把这个副本打乱顺序。接着,每次需要一个新的随机值时,就从这个打乱的列表中一个一个地取出元素:
shuffled = origlist[:]
random.shuffle(shuffled)
def produce_random_value():
return shuffled.pop()
这样做可以确保不会重复取到同样的元素。不过,要注意的是,当你取完所有的数字后,就没有可以选择的了。这个时候,你可以再复制一次列表,然后重新打乱。
如果你想一直这样做,可以把这个过程做成一个生成器函数:
def produce_randomly_from(items):
while True:
shuffled = list(items)
random.shuffle(shuffled)
while shuffled:
yield shuffled.pop()
然后你可以在一个循环中使用这个生成器,或者用 next()
函数来获取一个新的值:
random_items = produce_randomly_from(inputsequence)
# grab one random value from the sequence
random_item = next(random_items)