随机数世界——数据是随机的,但程序和思维永远也不会随机
写在前面: The pseudo-random generators of this module should not be used for security purposes. For security or cryptographic uses, see the secrets module.
目录
模块导入
模块实战
函数介绍
Functions for integers
random.randrange(stop) 或 random.randrange(start, stop[, step])
random.randint(a, b)
Real-valued distributions
random.random()
random.uniform(a, b)
Functions for sequences
random.choice(seq)
模块案例
Help you choose
在程序中,你可能需要取一个1-10的正整数。此时,你只需要键入:
a = random.randint(1, 10)
怎么样,是不是很方便呢?
random模块能帮你解决几乎所有程序中关于随机数和概率的问题。
random模块是Python内置的,无需安装,只要在程序开头加一句:
import random
import random as rd
from random import *
# 以上三种写法只需任意选择一种,具体区别不再赘述。
先来几句简单的代码熟悉一下random(随机数模块)的工作机制,可以尝试自行理解(部分例子翻译自Python帮助文件)。如果遇到不能理解的代码,不用担心,您可以继续往下阅读:
>>> import random >>> random.random() # 随机小数: 0.0 <= x < 1.0 0.37444887175646646 >>> random.uniform(2.5, 10.0) # 随机小数: 2.5 <= x < 10.0 3.1800146073117523 >>> random.randrange(10) # 整数: 0 <= x < 10 7 >>> random.randrange(0, 101, 2) # 2的倍数: 0 <= x < 101 26 >>> random.choice(['win', 'lose', 'draw']) # 从序列中随机选择1个元素 'draw' >>> deck = 'ace two three four'.split() >>> random.shuffle(deck) # 将序列洗牌重组 >>> deck ['four', 'two', 'ace', 'three'] >>> random.sample([10, 20, 30, 40, 50], k=4) # 从序列中随机选择4个不重复的元素 [40, 10, 50, 30] >>> # 以下例子有难度 >>> choices(['red', 'black', 'green'], [18, 18, 2], k=6) ['red', 'green', 'black', 'black', 'red', 'black']
你可能已经对那些常用函数有了一定想法,让我们进一步探究,并验证你的想法。
random.randrange
(stop) 或 random.
randrange
(start, stop[, step])randrange函数返回一个start到stop之间的整数,可以理解为从range
(start, stop[, step])里随机选一个数。例:
>>> import random
>>> for i in range(10):
print(random.randrange(0, 10, 2))
4
0
2
8
2
2
2
8
6
8
注:此函数还可以这样理解:
def my_randrange(start:int, stop:int, step=1) -> int:
from random import choice # choice函数可以从一个集合里随机选出一个元素,文章后面会涉及
n = choice(range(start, stop, step))
return n
# 以上代码和random模块中的randrange函数效果几乎一致。
random.randint
(a, b)与randrange作用相同,返回一个a到b之间的整数,相当于从range(a, b+1)中任意选择一个整数,这里就不展开介绍了。
返回一个0到1之间的浮点数,例如: 0.8883687550064797, 0.7475846928234275, 0.059603601981795484 等。
返回一个a到b之间的浮点数。
注:对于uniform函数,其实可以这样理解:
def my_uniform(a:float, b:float) -> float:
from random import random
n = a + (b - a) * random() # random()指0到1的随机浮点数
return n
# 以上代码和random模块中的uniform函数效果几乎一致。
函数名 | 返回结果 | 生成方式 | 生成范围 |
random.random() | 浮点数 | 随机生成,概率平均 | 0 <= x < 1 |
random.uniform(a, b) | 浮点数 | 随机生成,概率平均 | 当ab,b <= x < a |
random.triangular(low=0.0, high=1.0, mode=None) | 浮点数 | 随机生成,三角分布 | low <= x< high |
random.choice
(seq)choice函数在程序中很常用,他可以从一个集合(列表或元组等)中随机选出一个元素,并将其返回。
>>> import random
>>> print("What shall we eat tonight?")
What shall we eat tonight?
>>> dinner = random.choice(("apple", "banana", "mp5"))
>>> print(dinner)
mp5
注意在random.choice(("apple", "banana", "mp5"))中,有两个括号,这是因为choice的参数是一个列表或元组,而不是多个元素。
import random
def check(se: str, num):
if len(se) > 100:
return False
try:
things_li = se.split(',')
num = int(num)
except ValueError:
return False
if not 2 <= len(things_li) < 50:
return False
elif not num <= len(things_li):
return False
return things_li
def choose(population: list, k: int) -> str: # 程序核心
if k == 1:
res = random.choice(population)
else:
res = random.sample(population, k)
return res
def one_choosing():
# 1.接收输入
checked = False
things = None
amount = None
while not checked:
things = input("Enter a list of things (split by ','): ")
amount = input("How many items do you want to choose: ")
things = check(things, amount)
if not things == False:
checked = True
else:
print("There's something wrong. Please type again: ")
# 2.处理数据
response = choose(things, int(amount))
# 3.输出数据
print("We choose " + str(response) + " for you. Thank you for using.")
if __name__ == '__main__':
while True:
one_choosing()
input("Press Enter to continue...")
print('\n**********\n')
这是本人第一次原创博客,文章写作不易,还请点赞支持![抱拳]