Random

生成单个随机数

# encoding:utf-8
import random

### 生成单元素
a = random.random()
# 返回0-1之间的随机浮点数
print(a)        # 0.2473362446838867

b = random.uniform(1, 10)
# 返回指定范围内的随机浮点数,上下限可互换
print(b)                        # 3.7800015747308917
print(random.uniform(10, 1))    # 6.59216478923806

c = random.randint(1, 10)
# 返回指定范围内的整数,上下限不可互换
print(c)        # 8
# print(random.randint(10, 1))

d = random.randrange(1, 10, 2)
# 返回序列内的一个随机数,注意此处并不生成序列
print(d)        # 7

e = random.choice(range(10))
# 随机选择序列内的一个数
print(e)        # 3

# f = random.choices(range(10))
# # 返回一个单元素的子序列
# print(f)        # [7]

g = random.sample(range(10), 3)
# 从序列中随机选择n个元素,注意返回的顺序是乱序
print(g)        # [8, 2, 9]

data = [1, 2, 3, 4, 5]
j = random.shuffle(data)
# 将序列顺序打乱,注意这里不生成新序列,也就是这个序列必须是可变数据
print(j)        # None
print(data)     # [1, 4, 5, 2, 3]

# 如果是不可变数据
data2 = (1, 2, 3, 4, 5)
data2_shuffle = random.sample(data2, len(data2))
print(data2_shuffle)    # [1, 3, 4, 2, 5]

注意python2中没有 random.choices

 

随机种子seed

seed方法改变随机数生成器的种子,通常在调用随机模块之前调用该方法。

seed种子相同时,生成的随机数相同,seed种子不同时,生成的随机数不同,种子之间可以互相切换。

print(random.random())  # 随机生成

random.seed(0)
print(random.random())  # 每次结果相同    0.844421851525
print(random.random())  # 每次结果也相同,但不同于上一句的结果    0.75795440294


random.seed(1)
print(random.random())  # 0.134364244112

random.seed(0)
print(random.random())  # 0.844421851525    可以根据seed切换

print(np.random.random())   # 随机的,random模块设定seed不影响np模块

np.random.seed(0)
print(np.random.random())   # 每次结果相同

 

Numpy

import numpy as np

nr=np.random
nr.seed(0)
np.set_printoptions(precision=2)    # 只显示小数点后2位

### rand
print(nr.rand(3,4))     # 产生[0,1]的浮点随机数,括号里面的参数可以指定产生数组的形状
# [[0.55 0.72 0.6  0.54]
#  [0.42 0.65 0.44 0.89]
#  [0.96 0.38 0.79 0.53]]
print(nr.rand())        # 0.568044561094

### randn
print(nr.randn(3,4))    # 产生标准正态分布随机数,参数含义与random相同
# [[ 0.76  0.12  0.44  0.33]
#  [ 1.49 -0.21  0.31 -0.85]
#  [-2.55  0.65  0.86 -0.74]]

### randint
print(nr.randint(1,10,size=(2,5)))      # 产生指定范围的随机数,最后一个参数是元祖,他确定数组的形状
# [[8 3 1 1 5]
#  [6 6 7 9 5]]
print(nr.randint(1,10))                 # 5

print(nr.randint([1, 2, 3], [10, 9 ,8], size=(2,3)))    # 分别给每列指定范围,前两个参数的 len 要等于 size[1]
# [[2 6 4]
#  [9 3 4]]

### normal
print(nr.normal(100,10,size=(4,2)))     # 正态分布 第一个参数是均值,第二个参数是标准差
# [[108.13  97.71]
#  [121.62  90.43]
#  [100.67 102.06]
#  [ 95.43  89.4 ]]

print(nr.normal([100, 90],[10, 3],size=(4,2)))  # 分别给每列指定均值方差

### uniform
print(nr.uniform(0,10,size=(3,4)))      # 均匀分布 前两个参数分别是区间的初始值和终值
# [[7.51 6.08 3.25 0.38]
#  [6.34 9.59 6.53 6.35]
#  [9.95 5.82 4.14 4.75]]

print(nr.uniform([0, 0, 1, 1], [10, 9, 8 ,7], size=(3,4)))  # 分别给每列指定范围

### possion
print(nr.poisson(2.0,size = (3,4)))     # 泊松分布 第一个参数为指定的lanbda系数
# [[3 3 5 1]
#  [3 3 5 1]
#  [3 2 1 2]]

### permutation
# permutation()随机生成一个乱序数组,当参数是n时,返回[0,n)的乱序,他返回一个新数组。
r1 = nr.randint(10,100,size = (3,4))
print(nr.permutation(r1))
# [[50 82 29 82]
#  [71 24 14 77]
#  [36 76 62 77]]
print(nr.permutation(5))     # [0 3 1 2 4]

### shuffle
# 使用shuffle打乱数组顺序,打乱原数组,不返回新数组
x = np.arange(10)
y = nr.shuffle(x)
print(y)            # None
print(x)            # [2 4 3 7 1 6 5 9 0 8]

### choice
# choice()函数从指定数组中随机抽取样本,size参数用于指定输出数组的大小
# replace参数为True时,进行可重复抽取,而False表示进行不可重复的抽取。默认为True
x = np.array(10)
c1 = nr.choice(x,size = (2,3))
print(c1)
# [[6 5 3]
#  [1 8 0]]
c2 = nr.choice(x,5,replace = False)
print(c2)        # [2 9 1 3 8]

 

TF

import tensorflow as tf

sess = tf.InteractiveSession()

### 生成符合正态分布的随机值
# tf.random_normal(shape, mean, stddev, dtype, seed, name)
a = tf.random_normal([2, 3], name='a')
print(a.eval())
# [[-1.2077953  -0.69333565 -0.10252991]
#  [ 0.51914424  0.7754795  -0.02618051]]


### 生成截断的正态分布的随机值
## 只保留[mean - 2stddev, mean + 2stddev]内的随机数
# tf.truncated_normal(shape, mean, stddev, dtype, seed, name)
b = tf.truncated_normal([2, 3], name='b')
print(b.eval())
# [[-1.8038174   1.521785    0.33182728]
#  [ 1.0274183  -0.39916983 -0.50485927]]


### 生成均匀分布的随机数
# tf.random_uniform(shape, minval, maxval, dtype, seed, name)
c = tf.random_uniform([2, 3], name='c')
print(c.eval())
# [[0.6636964  0.20990396 0.44687605]
#  [0.64548564 0.22155988 0.19247997]]


### 按行乱序
# tf.random_shuffle(value, dtype, name)
d = tf.random_shuffle([[1, 2], [3, 2]], name='d')
print(d.eval())

 

random VS np.random

1. randint 边界问题,random 包含边界,np 不包含

for i in range(10):
    print(np.random.randint(1, 3), random.randint(1, 3))    # np 不包涵3, random 包含3
# 1 3
# 2 2
# 2 2
# 2 3
# 2 3
# 1 1
# 1 2
# 2 1
# 1 2
# 1 1