我指的是Python随机模块'洗牌功能。
from random import shuffle
list = [1, 2, 3, 4]
shuffle(list)
我猜想上面的函数使用随机种子。我知道在C中,rand函数迭代计算机中的几个随机种子数。因此,当循环遍历函数时,随机函数不再变得随机。
shuffle函数的工作方式与C中的rand函数类似吗?如果是这样,我如何添加随机的种子? (我正在考虑以毫秒为单位使用时间来提出独特的价值)。
此前发布了有关此问题的已接受答案的评论但无法得到任何回复(Shuffling a list of objects in python)
编辑:
我想确保随机shuffle不会在循环中重复其shuffling方法。例如,
我想洗牌[1,2,3,4,5,6]
我循环了10000次。
它产生以下结果: [1,3,2,4,5,6] [2,1,4,5,3,6] ......(大量不同的洗牌组合) [1,3,2,4,5,6] [2,1,4,5,3,6] ......(重复模式)。
我想避免上述行为,因为我正在循环一大堆。以上行为会首先发生吗?如果是这样,我是否必须在一定数量的循环后更改种子?
答案 0 :(得分:3)
我知道在C中,rand函数会迭代计算机中的几个随机种子数。
不,不。它使用您使用srand
设置的任何种子,如果您未调用srand
,则使用1。
shuffle函数的工作方式与C中的rand函数类似吗?如果是这样,我如何添加随机的种子? (我正在考虑以毫秒为单位使用时间来提出独特的价值)。
Python's random
module uses either system time or OS-provided randomness sources to seed the RNG:
random.seed([x])
初始化基本随机数生成器。可选参数 x 可以 是任何可清洗的对象。如果省略 x 或
None
,则为当前系统时间 用来; 当前系统时间也用于初始化生成器 首次导入模块时。如果提供随机源 通过操作系统,它们被用来代替系统时间(见 有关可用性的详细信息,请os.urandom()
。在版本2.4中更改:以前,操作系统资源不是 使用
答案 1 :(得分:2)
几乎所有模块函数都依赖于random()的基本函数 在半开放范围[0.0,1.0]内均匀生成随机浮点数。 Python使用Mersenne Twister作为核心生成器。它产生 53位精度浮点数,周期为2 ** 19937-1。潜在的 C中的实现既快又线程安全。 Mersenne Twister 是最广泛测试的随机数发生器之一 存在。但是,完全确定性,它是不合适的 出于所有目的,并且完全不适合加密 目的。
随机模块还提供了使用的SystemRandom类 系统函数os.urandom()从源生成随机数 由操作系统提供。
警告不应使用此模块的伪随机生成器 出于安全目的。如果需要,请使用os.urandom()或SystemRandom 加密安全的伪随机数生成器。