如何生成1亿个手机号码?Python生成随机数的22种方法,random函数太强了~

简介: python源码解析

大家好,这里是Python程序员晚枫。

案例解析

最近在网上看到一个python的面试题目:如何用Python生成1亿个手机号码?

我第一眼看到的时候心想,这个还不简单?直接random.randint(1,999999999999)就完事了。

但是马上就发现了这其中的错误:这个是生成1-99999999之间的随机数,可能是1,也可能是666.

但电话号码是11位的,而且前3位只有指定的号段,比如135、136。直接random.randint(1,999999999999)这么做并不符合条件。

那么如何生成呢?于是有了下面这段代码:

import random
def create_phone_num(num):
    all_phone_nums = set()  # 存放生成的电话号码
    while True:  # 因为set会自动去重,因此死循环生成电话号码,直到等于num个号码停止
        start = random.choice(['135', '136', '137'])  # 存放前3位的号段,从中随机取一个
        end = ''.join(random.sample(string.digits, 8))  # 随机生成后面8位数字
        all_phone_nums.add(f'{start}{end}')  # 拼接前3位和后8位
        if len(all_phone_nums) >= num:  # 如果号码个数等于num,则停止
            break

phone_num(10000 * 10000)

经过这次写代码我才发现,原来Python的random里有那么多好用的生成随机数的方法。

我把它们全部整理出来了,今天我们就来一起学习一下~

如有遗漏或者错误,欢迎大家多多指点~

随机数是哪个文件生成的?

在上面的代码第一行:import random,我们导入了random这个标准库。

这个库只有一个文件:random.py,这个文件的结构主要分为3个部分(如下图所示),它们的作用分别是:

  • 2个主要的类:Random(_random.Random)SystemRandom(Random)

    • 其中我们使用最多的是Random()
  • 有2个测试方法:_test_generator(n, func, args)_test(N=2000)

    • 这一部分我们用不到
  • 我们调用的函数:使用方法如上面代码的random.choicerandom.sample,具体使用方法,我们接下来会详细解释。

profile-water

random提供了哪些随机数方法?

接下来我们重点讲解作为python的用户,我们会使用到哪些random的随机数方法,也就是上文提到的random.py文件里的第3部分。

如下图的代码所示,random提供的方法有22个,主要分为2类:

  • 普通用户常用的方法,一共有12个
  • 科学计算常用的方法,一共有10个

def-water

普通用户的12个随机数方法怎么用?

对于上面这22个随机数方法,我在这里重点介绍一下普通用户常用的那12个方法。

至于后面这个10个用于科学计算的方法,因为实在是高深,我就不在这里浪费时间了,有兴趣的同学,可以直接去翻一下数学书:《概率论》。

1. random.seed & random.getstate & random.setstate

把这3个放到一起说,是因为random本质上生成的是伪随机数,而这3个函数,很好的体现了伪随机数这个特性

代码示例:seed
# 指定seed后,生成的随机数一样
random.seed(1)
print('随机数1:', random.random())
random.seed(1)
print('随机数2:', random.random())

# output:
# 随机数1: 0.13436424411240122
# 随机数2: 0.13436424411240122
代码示例: random.getstate & random.setstate

import random

random.seed(42)

print(random.sample(range(20), k=10))

st = random.getstate()  # 取出生成上一行代码后,random的状态 

print(random.sample(range(20), k=20))  # print 20

random.setstate(st)  # 恢复上一次的随机状态

print(random.sample(range(20), k=10))  # print same first 10
# output:
# [12, 0, 4, 3, 11, 10, 19, 1, 5, 18]
# [4, 9, 0, 3, 10, 8, 16, 7, 18, 17, 14, 6, 2, 1, 5, 11, 15, 13, 19, 12]
# [4, 9, 0, 3, 10, 8, 16, 7, 18, 17]

2. random.random

随机生成一个[0,1)之间的浮点数

代码示例
float = random.random()
"""
float = 0.123565654548978
"""

3. random.uniform

产生[a,b]范围内一个随机浮点数

代码示例
float = random.uniform(11,15)
"""
float = 13.882923467738049
"""

4. random.randint

随机生成[a,b]范围内一个整数。

代码示例
int = random.randint(1, 9)
"""
int = 2
"""

5. random.choice

从非空序列中随机选取一个数据并带回,该序列可以是list、tuple、str、set。

代码示例
str = random.choice("程序员晚枫原创系列")
"""
str = 原
"""

6. random.choices

Python3.6版本新增。从集群中随机选取k次数据,返回一个列表,可以设置权重。一共有4个参数

  • population:集群,必填。
  • weights:相对权重。
  • cum_weights:累加权重,不常用。不能和weights共用。
  • k:选取次数。
代码示例
str = ["程", "序", "员", "晚", "枫"]
res = random.choices(str, weights=[0, 0, 1, 0, 0], k=5)
"""
因为给【员】这个字,通过weights参数增加了特别的权重:1,而其他的权重都是0,所以不论随机选多少次,结果都是【员】
res = ['员', '员', '员', '员', '员']
"""

7. random.randrange(a,b,step)

参考range的用法:

  • 不指定step,随机生成[a,b)范围内一个整数。
  • 指定step,step作为步长会进一步限制[a,b)的范围,比如randrange(0,11,2)意即生成[0,11)范围内的随机偶数。
  • 不指定a,则默认从0开始。
代码示例
int = random.randrange(3, 9)
"""
int = 5
"""

8. random.sample

从集合中选取k个元素,返回一个列表,集群可以是list、tuple、str、set。

  • 不会重复:可以理解为发一副扑克牌,确实是随机发,但是不会重复。
  • 随机次数,不能超过集合的长度。发牌的时候,一副牌有54张,不可能随机抽取100次。
代码示例
str = ["程", "序", "员", "晚", "枫"]
res = random.sample(str, 5)
"""
res = ['员', '序', '程', '枫', '晚']
"""

9. random.shuffle

打乱原来有顺序的集合,注意:这个方法没有返回值,它直接改变的是原集合的顺序。所以如果你想改变tuple这种不可变的集合,会报错。

代码示例
str = ["程", "序", "员", "晚", "枫", "有", "顺", "序"]
random.shuffle(str)
"""
str = ['枫', '顺', '员', '序', '有', '晚', '序', '程']
"""

10. random.getrandbits

生成指定位数大小的整数。

代码示例
int = random.getrandbits(8)
"""
int = 136
"""

写在最后

虽然自己是Python程序员,但是最近开发中却发现很多基础知识自己没掌握。

于是决定从这一篇开始,我决定带着当时加入Python时,喂马劈柴面朝大海的浪漫情怀,去认真的深入整理分享Python常用的知识点。

希望对你有用。

相关文章
|
6天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
19 3
|
10天前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
24 2
|
1月前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
52 18
|
29天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
57 8
|
1月前
|
Python
Python中的函数
Python中的函数
46 8
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
25天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
107 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
158 59
|
14天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
34 14