我们写python代码的时候,很少能用得上随机数,但是随机数有很多妙用。例如,在我们做测试数据集的时候,可以构建一个随机的dataframe;
或者在保存数据的时候,可以在每条数据前插入一列作为,不重复的ID 字段使用,为作为文件或数据块生成一个唯一的“指纹”,用于快速识别或索引。可以根据需求来设置自己的数据“指纹”!
以下是一些使用随机数的汇总:
1、random模块的随机函数
random.random():
返回一个[0, 1)范围内的随机浮点数。random.uniform(a, b):
返回一个指定范围内的随机浮点数,范围为[a, b]random.randint(a, b): 返回一个随机整数N,使得a <= N <=b
random.randrange(start, stop, step):
从指定范围内按指定基数递增的元素中随机选择一个,类似于range函数。step 是步长,要求整数;当范围很大时,生成随机数可能会比较慢。
random.choice(seq): 从非空序列x中随机选择一个元素
random.shuffle(): 用于将序列x中的元素随机打乱。
random.sample(population, k): 从总体population中随机抽取k个元素,要求k <=len(population)。
以下是代码运行的部分:
import random
print(random.random()) #0.9478274870593494
print(random.uniform(4, 5)) #4.056551367726809
print(random.randint(6,10)) #6
print(random.randrange(1, 10, 2)) #5
print('随机选择 100 以内一个偶数:',random.randrange(0, 101, 2))
#随机选择 1 到 100 之间的一个偶数
print('随机选择 100 以内的一个奇数:',random.randrange(1, 101, 2))
print(random.choice([1,5,4,8,7,14])#从列表中抽一个数出来
'''random.shuffle() 打乱列表'''
my_list = [1, 2, 3, 4, 5]
random.shuffle(my_list)
print(my_list) # 输出可能是 [1, 5, 3, 4, 2],每次输出可能不同
#random.shuffle 不会返回新的序列,而是就地修改传入的序列。
#由于 random.shuffle 修改的是原序列,如果需要保留原始序列,应该先复制一份序列,然后再进行打乱操作。
'''从列表中随机选择 2 个不重复的元素'''
items = ['Number1', 'Number2', 'Number3', 'Number4', 'Number5']
sample = random.sample(items, 2)
print(sample)
#['Number5', 'Number4']
2. 生成随机编码/字符串
用途:可以用来生成不重复的随机id,方便做数据库的管理
- md5加密的各种函数
MD5是一种广泛使用的哈希函数,它可以产生一个128位(16字节)的哈希值,通常用一个32位的十六进制字符串表示。
可以使用的场景:
A .生成数据唯一的id(重复率低,比随机字符串靠谱)
B .MD5 用来做存储用户密码的哈希值
C .一些网站的连接的加密方式是:SSL/TLS通过使用非对称的 MD5加密来建立一个安全的连接,随后使用对称加密来加密数据,从而保护数据在客户端和服务器之间传输过程中的隐私和完整性。因此,有时候在获取网站的request的时候,在header/data,甚至是网址的构建的时候也会用到
import hashlib #导入hash库函数
def hash_UTF8(text): #基于UTF-8生成的md5加密
'''ASCII编码:一个字节一共可以用来表示256种不同的状态
UTF-8是Unicode的实现方式之一 ,对应的编码是 \u9996\ 这种
UTF8的BOM头为 0xEF 0xBB 0xBF
Unicode大端模式为 0xFE 0xFF
Unicode小端模式为 0xFF 0xFE
'''
md5_result= hashlib.md5(text.encode(encoding='UTF-8')).hexdigest()
return md5_result
print(hash_UTF8('虚拟机柯尼卡')) #0c9a8ebe776ce41b1017e613a2d980cf
def hash_GBK(text):#基于GBK生成的md5加密
''' GBK编码,是对GB2312编码的扩展,因此完全兼容GB2312-80标准 兼容汉字、图形等的编码 '''
md5_result= hashlib.md5(text.encode(encoding='GBK')).hexdigest()
return md5_result
print(hash_GBK('虚拟机柯尼卡」 Ⅷ Ⅸ 『 』 〖 〗 【 】 £ ‰ § № ☆ ★ △ ▲ ※ → ← ↑')) #70ad1b56a830a421d1740e37e6ebfe90
def hash_GB2312(text): #基于GB2312生成的md5加密 汉字编码标准
'''非ASCII编码 基于区位码 的汉字编码标准,一般编码方式是:0xA0+区号,0xA0+位号。 '''
md5_result= hashlib.md5(text.encode(encoding='GB2312')).hexdigest()
return md5_result
print(hash_GB2312('0xB0 0xB2')) #6ef23e84a2a6d9af087fc6f38425930c
def hash_GB18030(text):#基于GB18030生成的md5加密
''' GB18030是对GB2312的扩展,其编码长度由2个字节变为1~4个字节 '''
md5_result= hashlib.md5(text.encode(encoding='GB18030')).hexdigest()
return md5_result
print(hash_GB18030('∈(0142)')) #b79d04b89ebe2b4e7767388ba3b7d71f
- 基于UUID编码生成随机数
import uuid #通用唯一识别码
def UUID_time():
'''基于时间戳 '''
return uuid.uuid1()
print(UUID_time()) #0fe9a715-f58b-11ee-92df-244bfe9a3ddd
def uuid3(text):
'''uuid3() 基于名字和MD5散列值,保证了同一命名空间中不同名字的唯一性 '''
return uuid.uuid3(uuid.NAMESPACE_DNS,text)
print(uuid3('木卡姆0xBB')) #e7860c98-4ef8-30de-8adc-eebce41612a0
def uuid4():
'''基于随机数,会重复。不常用 '''
return uuid.uuid4()
print(uuid4()) #6467f0d7-1f49-4963-9a57-c6dfee8d2713
#重复概率:2的128次方 分之一,概率也很小
def uuid5(text):
'''基于名字和SAHI值,使用SAHI算法 若有名字的唯一性要求,最好使用uuid3()或者uuid5()'''
return uuid.uuid5(uuid.NAMESPACE_OID,text)
- 生成随机字符串
import random
import string
def randN(N):
'''生成长度为 N的以串随机数 '''
min = pow(10, N - 1)
max = pow(10, N)
return random.randint(min, max - 1)
print( randN(5))
#最后的结果是:“49846” ,数值是随机的,可以生成目标长度的数字。
def generate_random_string(length):
'''生成32位的随机字符串,字母和数字都可以 '''
characters = string.ascii_letters + string.digits
return ''.join(random.choice(characters) for _ in range(length))
这些方法可以单独使用,也可以组合使用,以满足不同的随机性需求。例如,如果你需要生成一个随机的密码,你可以结合使用random.randint和random.choice来生成一个包含数字和字母的字符串。
3.随机生成dataframe
import numpy as np
import random
new=np.random.randint(0,100, size=[10,10])#从100个数内选出10列10行的随机数,但是会重复
new=np.random.choice(100, size=[10,10], replace=False)#从100个数内选出10列10行的随机数,不会重复
print(new)
4. 随机生成队列
def No_Repeat_Queue(N,start,end):
'''生成从start-end的不重复队列,数字长度为N个数,最后返回的是集合,用{}表示 '''
random_numbers = set()
while len(random_numbers) < N:
number = random.randint(start, end)
random_numbers.add(number)
return random_numbers
print(No_Repeat_Queue(10,-1,25))
5. 随机生成列表
如果是想生成顺序乱的数组,可以使用random.sample()生成不重复的列表:
def No_Repeat_numbers(N,start,end):
'''生成长度为N,从start-end 中选出的 列表 '''
No_Repeat_num= random.sample(range(start, end), N)
return No_Repeat_num
print(No_Repeat_numbers(10,1,101))
#选出从1-101的十个数
结果:[7, 16, 47, 4, 19, 18, 25, 62, 61, 58]