鱼C论坛

 找回密码
 立即注册
查看: 1546|回复: 15

[已解决]关于random模块的seed函数用法

[复制链接]
发表于 2020-7-24 13:35:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
random.seed(a=None, version=2)

-- 初始化随机数生成器

参数        含义
a       
        1. 如果省略该参数或者将其值设置为 None(默认),将使用当前系统时间作为随机数种子(如果操作系统提供了随机性来源,则用它来代替系统时间)
        2. 如果参数 a 为整数,则直接被用作随机数种子. 该参数的值也可以是字符串、字节、字节数组等

version       
        1. 如果 version=2(默认),字符串、字节或字节数组对象的每一个位都将比转换成整数使用
        2. version=1,用于从旧版本的 python 中复制随机序列,字符串和字节算法生成更窄的种子范围


速查宝典的seed函数看不懂参数的含义,涉及知识盲区,有哪位大佬能用通俗的话帮忙解答一下吗
最佳答案
2020-7-24 13:56:47
本帖最后由 Twilight6 于 2020-7-24 14:00 编辑


我们先了解下随机数种子是什么,看下面资料:

随机数就是就随机数种子中取出的数。种子就是个序号,这个序号交给一个数列管理器,通过这个序号,你从管理器中取出一个数列,这个数列就是你通过那个序号得到的随机数。

但这个随技术并不真正随机。因为它是通过某个算法的得到。也就是说你给数列管理器同一个序号将得到同样一个“随机”数列。


从甲鱼哥的速查宝典的标题就可以看出,random 是生成伪随机数,而不是真正意义上的随机

而 seed 就是设置下次随机的种子,也就是下次随机数的序号,而每个随机数在系统中都有自己的种子(序号),所以你使用 seed 可以使得下个随机数直接生成对应序号的随机数

所以当你 seed 的参数是不变的,也就会导致实际上是序号不变,也就会一直生成这个随机数,看下面的例子:
import random

random.seed(10)
print(random.random())
random.seed(10)
print(random.random())
random.seed(10)
print(random.randint(1,100))
random.seed(10)
print(random.randint(1,100))

输出结果:
0.5714025946899135
0.5714025946899135
74
74

而且不同的随机数数列管理器,种子序号自然也会不同,看下面的代码:
import random

random.seed(10)
print(random.randint(1,10))
random.seed(10)
print(random.randint(1,100))

输出结果:
10
74

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-24 13:56:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-24 14:00 编辑


我们先了解下随机数种子是什么,看下面资料:

随机数就是就随机数种子中取出的数。种子就是个序号,这个序号交给一个数列管理器,通过这个序号,你从管理器中取出一个数列,这个数列就是你通过那个序号得到的随机数。

但这个随技术并不真正随机。因为它是通过某个算法的得到。也就是说你给数列管理器同一个序号将得到同样一个“随机”数列。


从甲鱼哥的速查宝典的标题就可以看出,random 是生成伪随机数,而不是真正意义上的随机

而 seed 就是设置下次随机的种子,也就是下次随机数的序号,而每个随机数在系统中都有自己的种子(序号),所以你使用 seed 可以使得下个随机数直接生成对应序号的随机数

所以当你 seed 的参数是不变的,也就会导致实际上是序号不变,也就会一直生成这个随机数,看下面的例子:
import random

random.seed(10)
print(random.random())
random.seed(10)
print(random.random())
random.seed(10)
print(random.randint(1,100))
random.seed(10)
print(random.randint(1,100))

输出结果:
0.5714025946899135
0.5714025946899135
74
74

而且不同的随机数数列管理器,种子序号自然也会不同,看下面的代码:
import random

random.seed(10)
print(random.randint(1,10))
random.seed(10)
print(random.randint(1,100))

输出结果:
10
74

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-24 14:16:52 | 显示全部楼层
如果你没有设定 random.seed() 函数或 random.seed() 函数参数为空时使用 random.random() 函数返回的结果将是随机的:
>>> random.random()
0.1456692551041303
>>> random.random()
0.45492700451402135
>>> random.random()
0.7707838056590222
>>> random.random()
0.705513226934028

当你使用了 random.seed() 函数并为 a 参数赋值时使用 random.random 函数时返回的结果将被固定在一个随机数上:
>>> random.seed(100)
>>> random.random()
0.1456692551041303
>>> random.seed(100)
>>> random.random()
0.1456692551041303
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-24 14:17:52 | 显示全部楼层
Twilight6 发表于 2020-7-24 13:56
我们先了解下随机数种子是什么,看下面资料:

你敢不敢不这么快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-24 14:29:03 | 显示全部楼层
nahongyan1997 发表于 2020-7-24 14:16
如果你没有设定 random.seed() 函数或 random.seed() 函数参数为空时使用 random.random() 函数返回的结果 ...

seed函数内的1是不是相当于一个变量
获取随机值后,只要seed函数参数调用1就还是返回同样的随机值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-24 14:33:50 | 显示全部楼层
Twilight6 发表于 2020-7-24 13:56
我们先了解下随机数种子是什么,看下面资料:

打个比方,是不是相当于1是一个字典类的储蓄器,如果用seed函数参数给1然后获取两个随机值0-10和0-100
然后下次调用randint 0-10 就输出原来的伪随机数,randint0-100就输出原来0-100的伪随机数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-24 14:38:31 | 显示全部楼层
UncleMonster 发表于 2020-7-24 14:29
seed函数内的1是不是相当于一个变量
获取随机值后,只要seed函数参数调用1就还是返回同样的随机值

没错,就像在使用下标索引一个数组内的元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-24 14:45:02 | 显示全部楼层
UncleMonster 发表于 2020-7-24 14:33
打个比方,是不是相当于1是一个字典类的储蓄器,如果用seed函数参数给1然后获取两个随机值0-10和0-100
...


是的,他是通过特殊的算法,来给你随机数序列里面排序,然后每一个都有对应的种子(序列号)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-24 14:49:36 | 显示全部楼层
Twilight6 发表于 2020-7-24 14:45
是的,他是通过特殊的算法,来给你随机数序列里面排序,然后每一个都有对应的种子(序列号)

以前玩易语言的时候里面就有一个 置随机数种子 和一个 取随机数 .

点评

  发表于 2020-7-24 15:04
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-24 15:07:51 | 显示全部楼层
Twilight6 发表于 2020-7-24 14:45
是的,他是通过特殊的算法,来给你随机数序列里面排序,然后每一个都有对应的种子(序列号)

感谢大佬,最佳能不能给两个不然搞得有点尴尬

点评

没事,看你心情给吧哈~  发表于 2020-7-24 15:08
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-24 15:22:47 | 显示全部楼层
UncleMonster 发表于 2020-7-24 15:07
感谢大佬,最佳能不能给两个不然搞得有点尴尬

他都1600+了他不缺了,给我吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-24 15:25:44 | 显示全部楼层
哎呀,来迟了一步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-24 15:25:52 | 显示全部楼层
nahongyan1997 发表于 2020-7-24 15:22
他都1600+了他不缺了,给我吧。

讲究先来后到吧太为难了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-24 15:32:07 | 显示全部楼层
UncleMonster 发表于 2020-7-24 15:25
讲究先来后到吧太为难了

没事我想到这个结果了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 20:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表