如何使用random.seed随机化字符串列表?

时间:2012-02-29 02:46:29

标签: python random

所以我在Python中有一个包含4个字符串的列表,我希望返回该列表,但是随机化,只能达到一个特定的数字(下面代码中的变量'players')。我不能使用随机播放功能,但如果可以,请相信我,我愿意。

这是我到目前为止的代码:

players = raw_input('How many players? ')
players = int(players)
Roles = ["Role1", "Role2", "Role3", "Role4"]
print Roles[:players]

我需要以某种方式使用random.seed()函数随机化列表。我真的很困惑,因为我认为你只能使用random.seed()和数字,而不是字符串列表。如果有人可以帮助我,我会非常感激。

3 个答案:

答案 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