二维数组中的随机数

在 Python 中,我们可以通过使用 random() 方法和 range() 函数来创建数组或者填充随机数的二维数组。

range() 函数生成给定范围内的数字序列。

要生成一个随机数数组,我们将首先生成一个给定范围内的数字序列,然后我们将从该范围中选择随机数并将它们存储在一个数组中,如下面的代码所示:

import random
[random.random() for i in range(0,5)]

同样,要创建二维数组,我们可以使用嵌套列表推导式。
列表推导式是在 Python 中创建列表的一种简短方法,如下所示:

代码:

[[random.random() for i in range(0, 3)] for j in range(0, 3)]

新创建的二维数组包含 3 行 3 列。

随机数概率

考虑给我们一个元素列表,我们必须根据它们的优先级从列表中选择随机元素。

我们要做的是为列表的元素分配权重。
权重最高的元素将有更多机会出现在结果列表中。

换句话说,具有最高权重的元素将被添加到新列表中的概率最高。

在 Python 中,我们可以使用随机模块的choices() 方法根据概率从列表中选择一个随机元素。
choice() 方法的语法如下:

语法:

random.choices(sequence, weights, cum_weights, k)
  • sequence:是 Python 的可迭代对象,例如列表、元组或者数字范围。
  • weights:是可选的。它是一个列表,用于指定给定序列中元素的相对权重。权重指定要选择元素的概率或者可能性。
  • cum_weights 是可选的。它是一个列表,用于指定给定序列中元素的累积权重。权重指定要选择元素的概率或者可能性。
  • k 是可选的。它是一个整数,用于定义结果列表的大小(长度)。

使用以下公式计算相对权重:

relative_weight = weight of element / sum of all weights

而元素的累积权重使用以下公式计算:

cumulative_weight = weight of previous element + weight of the current element

random.choices() 的返回类型是基于输入列表元素的权重选择的元素的 k 大小列表。

示例:

import random
input_list = ['school', 'book', 'bag', 'bottle']
output_list = random.choices(input_list, weights = [10, 30, 40, 20], k = 8)
print(output_list)

从输出中可以看出,元素“bag”的概率最高,因此,它在结果列表中再次出现的概率最高。

生成真随机数

正如我们在开头提到的那样,基于算术参数生成随机数很容易猜测。
要生成真正的随机数,计算机必须测量物理参数。

例如,我们想生成一个真正的随机数,我们可以测量鼠标移动、输入设备的输入响应等。

在 Python 中,我们可以使用 random.SystemRandom() 类来生成真正的随机数。

该类使用操作系统提供的资源生成随机数,不依赖于任何软件。
这些数字无法复制。

我们可以通过 random.SystemRandom() 使用 random 模块的所有方法。
不同之处在于 SystemRandom() 使用操作系统资源。

import random
trng = random.SystemRandom()
trng.randint(1, 15)

此代码生成 1 到 15 之间的真正随机数。
类似地,我们可以使用 random.SystemRandom().random 生成真正的浮动随机数:

random.SystemRandom().random()

范围内的随机浮点数/双精度数

random 模块提供了几个函数来生成给定范围内的浮点数。

方法uniform(a, b)可以在a和b之间生成一个数n。

它将返回 a 和 b 之间的浮点数 n。
请注意,输出中包含 a 和 b。
这意味着随机数可以是 a 或者 b 或者 a 和 b 之间的任何数字。

import random
random.uniform(0, 10)

另一种生成浮动随机数的方法是使用 random() 函数。

random() 函数的语法如下:

random.random()

random() 函数不接受任何参数。
它将生成一个介于 0 和 1 之间的浮点随机数,其中 1 不包含在输出中。
范围定义为:[0.0, 1.0)。

import random
random.random()

Python生成 0 到 100 之间的随机数

要生成一个介于 0 到 100 之间的随机数,我们可以使用 random 模块的 randint() 方法。
randint() 的语法如下:

random.randint(a, b)

它将返回 a 和 b 之间的整数 n。
请注意,输出中包含 a 和 b。
这意味着随机数可以是 a 或者 b 或者 a 和 b 之间的任何数字。

代码:

import random
print(random.randint(0, 100))

如上例所示,我们需要先导入 random 模块。
然后调用randint()。
这个方法会给你一个随机整数。

生成无重复随机数(唯一随机数)

创建随机数列表时,列表中可能会出现重复元素。
为了避免重复元素列表,random 模块定义了一个名为 sample() 的函数,该函数创建一个列表而不重复任何元素。

语法:

random.sample(sequence, k)
  • sequence:是可迭代的。它可以是列表、元组、集合或者字符串等。
  • k:是结果列表的大小(长度)。 k 不应大于输入列表的大小。

random.sample() 的返回类型是一个没有任何重复元素的元素列表。
下面的示例演示了如何在列表、字符串和元组上使用 sample() 方法。

代码:

import random
mylist = [1, 2, 3, 4, 5]
print (random.sample(mylist, 4))
mytuple = ('egg', 'apple', 'banana', 'orange', 'cherry')
print (random.sample(mytuple, 3))
mystring = "onitroad"
print (random.sample(mystring, 3))

打乱数

我们可以使用 random 模块的 shuffle() 方法对给定序列或者可迭代中的元素进行打乱。
shuffle() 方法的语法如下:

语法:

random.shuffle(sequence, function)
  • sequence:是一个可迭代对象,例如列表、集合或者元组。
  • function: 是可选的,默认为 random()。它返回一个范围从 0.0 到 1.0 的值。

该方法不返回任何内容。
它只会打乱原始列表。
通过改组,我们的意思是元素将从它们的原始位置改变。

代码:

import random
my_list = ['a', 'b', 'c', 'd', 'e']
print ("List before shuffling", my_list)
random.shuffle(my_list)
print ("List after shuffling", my_list)

负随机数

数学中数轴的中点是0。
0右边的数是正实数,0左边的数是负实数。

要生成负随机数,我们可以指定从负数开始到 0 停止的范围。
请考虑以下示例:

import random
random.uniform(-10, 0)
random.randrange(-50, 0)
random.randint(-40, 0)
在 Python 中生成随机数

有两种类型的随机数生成器:伪随机数生成器和真随机数生成器。

伪随机数取决于计算机算法。
计算机使用算法来生成随机数。
这些随机数并不是真正的随机数,因为它们就像使用 NumPy 随机种子生成的数字一样是可预测的。

而真正的随机数是通过测量真正的物理随机参数生成的,因此我们可以确保生成的数字是真正随机的。

在密码学中使用伪随机数是不安全的,因为它们可以被攻击者猜到。

在 Python 中,内置的 random 模块生成伪随机数。

生成重复值

有很多方法可以生成具有重复元素的随机数列表。
我们可以使用 random.randrange() 或者 random.choice() 创建重复元素列表。

使用 randrange()

代码:

import random
my_list = [random.randrange(10) for x in range(0, 10)]
print (sorted(my_list))

我们使用了 sorted() 方法对列表进行排序。

使用choice()

代码:

import random
my_list = [random.choice(range(10)) for x in range(0, 10)]
print (sorted(my_list))

均值和标准差

random 模块提供了生成具有给定均值和标准差的随机数的方法。

要在正态分布中生成随机数,可以使用称为 random.normalvariate() 的方法。
normalvariate() 方法的语法如下:

语法:

random.normalvariate(mu, sigma)
  • mu 是平均值
  • sigma 是标准差

random.normalvariate(mu, sigma) 返回一个具有正态分布的浮点随机数。

同样,我们有方法生成具有高斯分布和对数正态分布的随机数。

random.gauss(mu, sigma) 用于生成具有高斯分布的浮点随机数。
random.lognormvariate(mu, sigma) 生成具有对数正态分布的浮点随机数。

代码:

import random
random.normalvariate(2, 6)
random.gauss(2, 6)
random.lognormvariate(2, 6)

在下面的示例中,我们将生成一系列随机数并使用 matplotlib 绘制图形以观察上述分布。

代码:

import random
import matplotlib.pyplot as plt
normal_dist = [random.normalvariate(250, 100) for i in range(100)]
plt.plot(normal_dist)
plt.show()

使用高斯分布:

gauss_dist = [random.gauss(250, 100) for i in range(100)]
plt.plot(gauss_dist)
plt.show()

同样,对于对数正态分布

lognormvariate_list = [random.lognormvariate(250, 100) for i in range(100)]
plt.plot(lognormvariate_list)
plt.show()

从范围中排除某些数字(有条件的选择)

要在给定范围内生成不包括某些数字的随机数,我们可以使用 random.choice() 方法。
考虑下面的例子:

import random
print (random.choice([x for x in range(0, 10) if x not in [1, 3, 5, 7, 9]]))

在这个例子中,我们使用了 for 循环来遍历从 0 到 10 的元素列表。

然后我们使用了一个条件,即范围 (0, 10) 中的迭代 (x) 不应出现在给定的奇数列表中。
因此,生成的数字将始终是偶数。

长度为 N 的随机数

在 Python 中,我们可以生成一个固定长度的随机数,即数字中的 n 位数。
例如,我们想生成一个长度为 n 的随机数,其中 n = 3.

可以生成100到999范围内的三位数随机数,因此在randint()方法中,指定起点为100,终点为999.

在 randint() 方法中,包括起点和终点。

考虑下面的例子:

import random
print (random.randint(100, 999))

圆上的随机数

使用随机模块,我们可以在圆形分布中生成随机点。
在本节中,我们将找到圆的随机坐标。
考虑下面的例子:

代码:

import random
import math
radius_circle = 5
center_x = 3
center_y = 5
rand_angle = 2 * math.pi * random.random()
rand_radius = radius_circle * math.sqrt(random.random())
cord_x = rand_radius * math.cos(rand_angle) + center_x
cord_y = rand_radius * math.sin(rand_angle) + center_y
print("Random Points on circle: ", (cord_x, cord_y))

具有步长的随机数

另一个在指定范围内生成整数随机数的函数是 randrange()。
randrange() 方法最多可以接受三个参数:start、stop 和 step。
randrange() 的语法如下:

语法:

random.randrange(start, stop, step)

返回整数介于开始(包括开始)和结束于停止(不包括停止)之间。
step 指定查找随机数的增量值,默认为 1.

例如,如果 start 等于 0,stop 等于 15,step 为 3,那么随机数将是 3 的倍数,即:0、3、6、9、12 或者 15.

换句话说,步长是与起始值相加的增量值。

请注意,函数中的 start 和 step 参数是可选的。

代码:

import random
random.randrange(0, 15, 3)

randrange() 和 randint() 的区别在于,终止值不包含在 randrange() 方法中,而是包含在 randint() 方法中。

来自 Iterable 的随机数

为了从可迭代(堆栈或者序列)生成随机数,Python random 模块有一个名为 random.choice(seq) 的函数。

random.choice(seq) 方法将从给定的序列中返回一个随机元素。

使用 random.choice()

import random
x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
random.choice(x)

我们还可以使用 randint() 和 randrange() 函数从给定序列中选择随机元素。

使用 randint()

import random
x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
index = random.randint(0, len(x)-1)
x[index]

在这段代码中,我们首先创建了一个列表,然后选择了一个从 0 到列表长度的随机整数。
然后使用索引,我们从列表中找到随机索引中的字母。

这样我们就可以使用 randint() 从列表中获取一个随机元素。

使用 randrange()

import random
x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
index = random.randrange(0, len(x))
x[index]

请注意,我们在 randint() 方法中从列表的长度中减去 1,而在 randrange() 方法中没有减去任何内容。
这是因为 randint() 包括停止点。
因此,我们必须减去 1.

日期:2020-07-15 11:16:23 来源:oir作者:oir