所以我在Python中有一个包含4个字符串的列表,我希望返回该列表,但是随机化,只能达到一个特定的数字(下面代码中的变量'players')。我不能使用随机播放功能,但如果可以,请相信我,我愿意。
这是我到目前为止的代码:
players = raw_input('How many players? ')
players = int(players)
Roles = ["Role1", "Role2", "Role3", "Role4"]
print Roles[:players]
我需要以某种方式使用random.seed()函数随机化列表。我真的很困惑,因为我认为你只能使用random.seed()和数字,而不是字符串列表。如果有人可以帮助我,我会非常感激。
答案 0 :(得分:9)
虽然random.shuffle
(或random.sample
)是 Python Way ,但如果真的不是一个选项,请考虑使用现有的众所周知的方法。下面的代码是Fisher-Yates Shuffle的一个实现(它改编自该页面上的Sattolo变体代码):
from random import randrange
def shuffle(items): # mutates input list
i = len(items)
while i > 1:
j = randrange(i) # 0 <= j <= i
items[j], items[i] = items[i], items[j]
i = i - 1
return
有时看到的另一种方法是使用随机数序列压缩列表,根据随机数进行排序,然后提取原始值。
from random import random
def shuffle(items): # returns new list
return [t[1] for t in
sorted((random(), i) for i in items)]
在任何情况下,random.seed
仅为所使用的PRNG (Pseudo-random number generator)设置种子。也就是说,random.seed
将影响未来生成的随机数(以及利用它们的函数),但不会自己“获取”随机值或“随机”或“随机化”任何内容。 (如果没有调用它通常很好,因为有一个合适的“默认种子”设置,但有时它很好 - 例如在测试或纸牌游戏中的重复性 - 设置一个特定的种子。)
例如,试试这个:(如果使用Python 2.x,从print
中删除括号):
from random import seed, random
# should all be the same value, whatever that is.
seed(1)
print(random())
seed(1)
print(random())
seed(1)
print(random())
# should be two different values (and different from above)
print(random())
print(random())
# should be same as first three values
seed(1)
print(random())
要理解的关键是 PSEUDO RANDOM 源(PRNG)采用CURRENT内部状态 - 可以使用“种子”设置,尽管现代PRNG的大得多< / em>内部状态 - 并使用它来生成随机值和 NEXT内部状态。 TRUE RANDOM 源(例如,采样静态噪声的专用硬件)没有“种子”的概念。
快乐的编码。
答案 1 :(得分:0)
这是一个不使用random.seed
的选项(这是对此类任务的异常请求),但与此同时,不使用{{1} ,或者。
random.shuffle
所以,恰好>>> from random import choice
>>> roles = ['P1', 'P2', 'P3', 'P4']
>>> players = 3
>>> p = roles[:players]
>>> p
['P1', 'P2', 'P3']
>>> first = choice(p)
>>> p.remove(first)
>>> p
['P1', 'P2']
>>> second = choice(p)
>>> p.remove(second)
>>> p
['P1']
>>> last = choice(p)
>>> p.remove(last)
>>> p
[]
>>> (first, second, last)
('P3', 'P2', 'P1')
以相反的顺序选择了choice
的元素。在序列中较大的候选池中,远的可能性较小。
p
希望你能找到一种方法来合并>>> l = range(1000)
>>> f = choice(l)
>>> f
967
,但就个人而言,我没有看到一个非常好的论据(参见上面的random.seed
)答案。
答案 2 :(得分:0)
players = raw_input('How many players? ')
players = int(players)
roles = ["Role1", "Role2", "Role3", "Role4"]
selected_roles = random.sample(roles[:players], players)
print selected_roles