前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python3 生成伪随机数

Python3 生成伪随机数

作者头像
嵌入式视觉
发布2022-09-05 14:21:30
5110
发布2022-09-05 14:21:30
举报
文章被收录于专栏:嵌入式视觉

Contents

在项目中,我们做随机图像增强或者概率性的需求时,可能会用到随机函数,这里介绍下 Python3 自带的伪随机数生成器模块 random,大多数知识来源于官网教材,我加以总结和添加代码实例

random模块介绍

  • 对于整数,从范围中有统一的选择。 对于序列,存在随机元素的统一选择、用于生成列表的随机排列的函数、以及用于随机抽样而无需替换的函数。
  • 在实数轴上,有计算均匀、正态(高斯)、对数正态、负指数、伽马和贝塔分布的函数。 为了生成角度分布,可以使用 von Mises 分布。
  • 几乎所有模块函数都依赖于基本函数 random() ,它在半开放区间 [0.0,1.0) 内均匀生成随机浮点数。

random 模块常用函数学习

必须记住的函数

  • random.sed(a=None, version=2):初始化随机数生成器。如果 a 被省略或为 None ,则使用当前系统时间。 如果操作系统提供随机源,则使用它们而不是系统时间
  • random.getstate()返回捕获生成器当前内部状态的对象。 这个对象可以传递给 setstate() 来恢复状态。
  • random.setstate(state):state 应该是从之前调用 getstate() 获得的,并且 setstate() 将生成器的内部状态恢复到 getstate() 被调用时的状态。可以和random.getstate()一起配合使用,使得程序中两个不同地方的变量获得相同的随机数状态

返回随机整数用函数

  • random.randrange(stop):初始值默认为 0,返回 0-stop 之间的随机数整数
  • random.randrange(start, stop[, step]):从 range(start, stop, step) 返回一个随机选择的元素。 这相当于 choice(range(start, stop, step)) ,但实际上并没有构建一个 range 对象。
  • random.randint(a,b)生成随机整数 N 满足 a <= N <= b。相当于 random.randrange(a, b+1),但这个函数更常用。

实例代码如下:

代码语言:javascript
复制
>>> import random
>>> random.randint(1,20)
2
>>> random.randint(1,20)
1
>>> random.randrange(10)
5

以上三个返回随机整数用的函数,在重复使用的情况下,可能会返回重复的随机整数

返回随机序列用函数

  • random.choice(sep): 从一个序列中随机选取一个元素返回
  • random.shuffle(x[,random]):将序列x随机打乱位置(原地打乱):不返回任何对象
  • random.sample(population,k)返回从总体序列或集合中(population)选择的唯一元素的 k 长度列表。 用于无重复的随机抽样。

实例代码如下:

代码语言:javascript
复制
>>> range_list = list(range(10))
>>> range_list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> random.choice(range_list)
6
>>> random.shuffle(range_list)
>>> range_list
[9, 0, 5, 7, 4, 3, 2, 6, 1, 8]
>>> random.sample(range_list, 3)
[3, 8, 2]

返回实指分布函数

以下函数生成特定的实值分布,如常用数学实践中所使用的那样, 函数参数也以分布方程中的相应变量命名:

  • random.random()返回 [0.0, 1.0) 范围内的下一个随机浮点数。
  • random.uniform(a, b)返回a到b之间的一个随机浮点数 N ,当 a <= b 时 a <= N <= b ,当 b < a 时 b <= N <= a 。取决于等式 a + (b-a) * random() 中的浮点舍入,终点 b 可以包括或不包括在该范围内。
  • 其他不常用的如:Beta分布random.betavariate(alpha, beta),Gamma分布random.gammavariate(alpha, beta),指数分布random.expovariate(lambd)等

实例代码如下:

代码语言:javascript
复制
>>> random.random()                                                        
0.5031251868994626
>>> random.random()
0.9571548892051094
>>> random.uniform(1,2)
1.2647918605857986
>>> random.uniform(1,2)
1.7418032314031406

练习题

例子1:地理老师为了考核班里的20个学生,中国34个省的省会城市是什么。但为了防止学生作弊,每份试卷的题目顺序不一样,答案也不一样。因此需要写一个程序创建20份试卷,每份试卷创建34个多重选择题,次序随机。为每个题提供一个正确答案和3个随机的错误答案。试卷写进20个文本文件,每份试卷的答案也写进20个文本文件。  代码如下:

代码语言:javascript
复制
import random
capital_city_string = "北京市--北京 ;上海市 --上海 ;天津市 --天津 ;重庆市 --重庆 ;" \
                    "黑龙江省 --哈尔滨 ;吉林省 --长春; 辽宁省 --沈阳 ;内蒙古自治区--呼和浩特 ;" \
                     "河北省 --石家庄 ;新疆维吾尔自治区--乌鲁木齐 ;甘肃省-- 兰州 ;青海省--西宁 ;" \
                     "陕西省 --西安 ;宁夏回族自治区--银川 ;河南省-- 郑州 ;山东省--济南 ;" \
                    "山西省--太原 ;安徽省--合肥 ;湖南省--长沙;湖北省--武汉 ;江苏省--南京 ;" \
                     "四川省--成都; 贵州省--贵阳 ;云南省--昆明 ;广西壮族自治区--南宁 ;" \
                    "西藏自治区-- 拉萨 ;浙江省--杭州; 江西省--南昌 ;广东省--广州 ;福建省--福州 ;" \
                    "台湾省--台北 ;海南省 --海口 ;香港特别行政区-- 香港; 澳门特别行政区-- 澳门"
grade = {0: "A", 1: "B", 2: "C", 3: "D"} # 设置答案等级
def get_dict(city_string): # 将省会和省会城市的字符串转变成一个字典格式
    province_and_capital_dict = {}
    city_list = city_string.split(";")
    for city_index in city_list:
        province_and_capital_list = city_index.split("--")
        province_and_capital_dict[province_and_capital_list[0]] = province_and_capital_list[1]
    return province_and_capital_dict

def make_test_paper(province_and_capital_dict):
    for i in range(20):
        f_test = open("E:\\test" + str(i + 1) + ".txt", "w+") # 创建试卷文件
        f_answer = open("E:\\answer" + str(i + 1) + ".txt", "w+") # 创建试卷答案文件
        f_test.write("Name:\n") # 试卷前需要学生填写自己的姓名
        f_test.write("Score:\n\n") # 试卷的得分
        province_and_capital_dictkeys = list(province_and_capital_dict.keys()) # 获得34省列表
        random.shuffle(province_and_capital_dictkeys) # 随机打乱34省列表的顺序
        for i in range(34): # 循环创建34个题目
            # 将问题写入文件
            f_test.write(str(i+1)+","+"what's the capital of " + province_and_capital_dictkeys[i]+"?\n")
            correct_answer = province_and_capital_dict[province_and_capital_dictkeys[i]] # 问题的正确答案
            error_answer = list(province_and_capital_dict.values()) # 所有的答案
            error_answer.remove(correct_answer) # 在所有答案中移除正确的那个答案,得到错误答案的列表
            random.shuffle(error_answer) # 随机打乱错误答案
            answer = random.sample(error_answer, 3) # 在错误答案列表中随机选择3个错误答案
            answer.append(correct_answer) # 将正确答案添加到答案列表中
            random.shuffle(answer) # 再打乱4个答案的顺序
            f_test.write("\n"+grade[0]+answer[0]+"\n"+grade[1]+answer[1]+"\n"+grade[2]+answer[2]+"\n"+grade[3] +
                         answer[3] + "\n\n") # 得到A、B、C、D四个答案,并写入到文件中
            answer_grade = ""
            for answer_index in answer:
                if answer_index == correct_answer:
                    index = answer.index(answer_index)
                    answer_grade = grade[index] # 得到正确答案的等级(A、B、C、D)
            f_answer.write(str(i+1)+","+answer_grade+correct_answer) # 最后将答案写入试卷答案文件
        f_test.close()
        f_answer.close()
# 调用两个方法
if __name__ == "__main__":
    province_and_capital_dict = get_dict(capital_city_string)
    print(province_and_capital_dict)
    make_test_paper(province_and_capital_dict)

例2:生成随机验证码

代码语言:javascript
复制
# -*- coding: utf-8 -*-
# author: honggao.zhang
# get random code

import random


def get_code(flag="number_case"):
	source = []
	if flag == "number_case":
		for i in range(48, 58):
			source.append(chr(i))  # 所有数字
		result = ''.join(random.sample(source, 4))

	if flag == "upper_case":
		for i in range(65, 91):
			source.append(chr(i))
		result = ''.join(random.sample(source, 4))

	elif flag == "lower_case":
		for i in range(97, 123):
			source.append(chr(i))
		result = ''.join(random.sample(source, 4))

	elif flag == "all_case":
		source = []
		for i in range(48, 58):
			source.append(chr(i))  # 所有数字
		for i in range(65, 91):
			source.append(chr(i))  # 所有大写字母
		for i in range(97, 123):
			source.append(chr(i))  # 所有小写字母
		result = ''.join(random.sample(source, 4))

	return result


if __name__ == "__main__":
	# chr函数用一个整数作参数,返回一个对应的字符
	# print([chr(i) for i in range(65, 91)])  # 所有大写字母
	# print([chr(i) for i in range(97, 123)])  # 所有小写字母
	# print([chr(i) for i in range(48, 58)])  # 所有数字
	result = get_code(flag="all_case")
	print(result)  # sFcD

参考资料

python3—-生成随机数(random模块) random-生成伪随机数

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • random模块介绍
  • random 模块常用函数学习
    • 必须记住的函数
      • 返回随机整数用函数
        • 返回随机序列用函数
          • 返回实指分布函数
          • 练习题
          • 参考资料
          相关产品与服务
          验证码
          腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档