如何在没有numpy的情况下生成随机矩阵

2024-10-03 21:32:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了这个问题:创建一个没有numpy的随机矩阵

我搜索了一下这个词,但没有找到。每次我搜索一个随机数时,你都必须重新设定种子吗?我的解决办法是:

import random

def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    blank = [0]
    row = blank*n_filas
    array = [row]*n_columnas
    
    for j in range(n_columnas):
        for i in range(n_filas):
            array[j][i] = random.randint(0,100*10**num_decimals)/10**num_decimals
    return array

但我的产出是:

[[80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97]]

所以这显然不是随机的。如何改进?为什么这是坏代码?提前谢谢


Tags: innumpyforrange矩阵randomarray种子
3条回答

您使用了array = [row]*n_columnas。这使得array中的每个术语都是相同的对象,row。因此,行中的所有项目都是相同的。您可以创建一个空的array并每次添加一个list对象。例如:

import random

def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    array = []
    
    for j in range(n_columnas):
        array.append([])  # Add a list to the array
        for i in range(n_filas):
            array[j].append(random.randint(0,100*10**num_decimals)/10**num_decimals)  # Add number to row
    return array

我会给你想要的答案

这个问题与设置随机数生成器种子无关,因为您正在创建一个矩阵,该矩阵引用同一行列表n_columnas次。 通过使用list comprehension初始创建空矩阵,可以轻松解决此问题:

from pprint import pprint
import random


def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    array = [[0 for _ in range(n_filas)] for _ in range(n_columnas)]

    for j in range(n_columnas):
        for i in range(n_filas):
            array[j][i] = random.randint(0,100*10**num_decimals)/10**num_decimals
    return array

array = matrix_random_number(7, 10)
pprint(array)

样本输出:

[[12.88, 47.27, 95.93, 60.3, 1.49, 6.75, 90.73],
 [6.87, 53.84, 78.22, 69.36, 62.34, 5.5, 66.63],
 [10.29, 42.7, 55.67, 25.68, 39.48, 91.17, 3.96],
 [59.77, 88.4, 52.77, 84.35, 21.0, 69.19, 35.0],
 [85.63, 10.75, 29.8, 67.25, 0.12, 58.79, 42.46],
 [34.87, 45.07, 25.64, 4.74, 71.25, 31.57, 83.94],
 [32.61, 41.17, 98.27, 88.85, 30.23, 62.89, 84.26],
 [82.04, 17.88, 75.25, 56.83, 51.69, 91.16, 32.7],
 [66.66, 56.21, 39.0, 6.27, 87.61, 70.42, 56.06],
 [49.68, 22.95, 78.53, 98.12, 74.47, 18.45, 94.32]]

正如其他人所指出的,您的问题是制作同一行对象的n个副本。我建议用嵌套列表来解决这个问题。这样就不需要临时变量、生成矩阵的多次传递或追加。这可能是一个1行,但这将是一个非常长的行,因此我为随机数生成创建了一个lambda,并将其分为两行:

from pprint import pprint
from random import randint

def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    gen_value = lambda decimals: randint(0,100*10**decimals)/10**decimals
    return [[gen_value(num_decimals) for _ in range(n_filas)] for _ in range(n_columnas)]

pprint(matrix_random_number(7, 10, 3))

样本输出:

[[59.742, 5.339, 91.339, 20.221, 81.702, 45.815, 23.141],
 [32.716, 29.27, 89.193, 4.021, 79.846, 93.345, 61.367],
 [47.356, 33.87, 40.541, 68.483, 45.646, 64.898, 89.818],
 [84.371, 12.451, 76.413, 23.809, 0.591, 77.24, 12.813],
 [9.277, 31.923, 2.892, 68.653, 14.253, 14.225, 70.227],
 [91.887, 79.071, 13.206, 45.259, 73.019, 24.426, 82.332],
 [96.539, 6.743, 38.21, 55.292, 11.639, 56.902, 46.614],
 [36.961, 58.359, 79.174, 1.52, 38.937, 93.708, 25.964],
 [47.933, 62.434, 80.944, 54.694, 31.286, 84.219, 7.059],
 [82.522, 3.77, 85.51, 11.485, 83.059, 89.95, 38.618]]

没有必要重新播种,事实上这样做会适得其反

相关问题 更多 >