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

ema*_*nim 5 python random

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

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

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

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

小智 10

虽然random.shuffle(或random.sample)是Python方式,但如果它确实不是一个选项,请考虑使用现有的众所周知的方法.下面的代码是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
Run Code Online (Sandbox Code Playgroud)

有时看到浮动的另一种方法是用一系列随机数压缩列表,基于随机数排序,然后提取原始值.

from random import random

def shuffle(items):  # returns new list
    return [t[1] for t in
            sorted((random(), i) for i in items)]
Run Code Online (Sandbox Code Playgroud)

在任何情况下,random.seed仅仅为所使用的PRNG(伪随机数发生器)设置种子.也就是说,将影响生成的未来随机数(以及利用它们的函数),但本身不会"获得"随机值或"随机"或"随机化"任何内容.(如果不调用它通常会很好,因为有一个合适的"默认种子"设置,但有时它很好 - 例如在测试或纸牌游戏中的重复性 - 设置一个特定的种子.)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())
Run Code Online (Sandbox Code Playgroud)

要理解的关键是PSEUDO RANDOM源(PRNG)采用CURRENT内部状态 - 可以使用"种子"设置,尽管现代PRNG具有更大的内部状态 - 并使用它来生成随机值 NEXT内部国家.甲真正的随机源不具有"种子"的概念(例如,该样品的静态噪声特种硬件).

快乐的编码.