Python 用固定和生成随机整数numpy向量

Python 用固定和生成随机整数numpy向量,python,numpy,Python,Numpy,基于这些代码,我想对指定了特定范围的整数进行随机化,但在最后三个数组中,我总共需要100。最后三个数组的总和不能超过100。我不知道如何解决这个问题 self.position = np.array([rd.randint(0,2), rd.randint(0,2), rd.randint(0,100), rd.randint(0,50), rd.randint(0,1)]) 对OP的以下评论的答复: 我不确定这样的随机性有多大,但是: def three_to_100_b(): a3

基于这些代码,我想对指定了特定范围的整数进行随机化,但在最后三个数组中,我总共需要
100
。最后三个数组的总和不能超过
100
。我不知道如何解决这个问题

self.position = np.array([rd.randint(0,2), rd.randint(0,2), rd.randint(0,100), rd.randint(0,50), rd.randint(0,1)])
对OP的以下评论的答复: 我不确定这样的随机性有多大,但是:

def three_to_100_b():
    a3 = random.randint(0,1)
    a2 = random.randint(0,50)
    a1 = 100-a3-a2
    return a1, a2, a3
将给您三个伪随机数,第一个在0-100范围内,第二个在0-50范围内,最后一个为0或1,并求和100

但是请注意,
a1
a2
之间的随机性非常小——它们在一条直线上,定义为+0或-1

注意,新的答案——旧的答案在随机性方面有缺陷。 将三个数字相加为100的一种方法是生成三个随机数,然后对它们进行缩放,使其总和为100。这太冗长了,但想法是:

#/usr/bin/env蟒蛇3
随机输入
定义三到一百()
r1=随机随机随机数(0100)
r2=random.randint(0100)
r3=随机随机随机数(0100)
a1=r1*100/(r1+r2+r3)
a2=r2*100/(r1+r2+r3)
a3=100-a1-a2
返回a1、a2、a3
#主要
打印(“x\t y\t z”)
对于范围(1000)内的i:
#打印(三到100()
a=三到一百()
打印(“{}\t{}\t{}”。格式(*a))
我绘制了前1000个数字的(x,y)对(第三个数字由点的颜色表示),我有:

旧答案 您可以生成一个从0到100的数字,然后生成另一个从0到100的数字(第一个数字),依此类推。最后一个不会是随机的:

#/usr/bin/env蟒蛇3
随机输入
定义三到一百()
r1=随机随机随机数(0100)
r2=random.randint(0100-r1)
r3=100-r1-r2
返回r1、r2、r3
#主要
对于范围(10)内的i:
打印(三到100()
输出将是:

[romano:~/tmp]./randsum.py
(26, 7, 67)
(85, 13, 2)
(43, 41, 16)
(75, 22, 3)
(66, 19, 15)
(30, 16, 54)
(43, 30, 27)
(36, 2, 62)
(31, 2, 67)
(91, 0, 9)
这是前两个数字的曲线图——它们看起来很随机,但也许它们在x-y轴上确实有点拥挤


尽管Rmano建议的解决方案是有效的,但它缺乏完全的随机性,因为一旦你画出第一个随机整数,另一个是伪随机的,或者因为依赖关系而根本不是随机的

在我看来,更随机的解决方案是:

import numpy as np

def generate_fix_sum_random_vec(limit, num_elem, tries=10):
    v = np.random.randint(0, limit, num_elem)
    s = sum(v)
    if (np.sum(np.round(v/s*limit)) == limit):
        return np.round(v / s * limit)
    elif (np.sum(np.floor(v/s*limit)) == limit):
        return np.floor(v / s * limit)
    elif (np.sum(np.ceil(v/s*limit)) == limit):
        return np.ceil(v / s * limit)
    else:
        return generate_fix_sum_random_vec(limit, num_elem, tries-1)



for i in range(25):
    test_vec = generate_fix_sum_random_vec(100, 3)
    test_vec = test_vec.astype(int)
    print("vec: ", test_vec, "sum of vector: ", np.sum(test_vec))
此解决方案更为稳健,可以对向量和的任何限制有效,并且通过更改
num\u elem
可以轻松适用于任何长度的向量。此外,它不做任何假设,只是在找到匹配项之前一直尝试

循环的输出:

vec:  [53 32 15] sum of vector:  100
vec:  [40 38 22] sum of vector:  100
vec:  [56 38  6] sum of vector:  100
vec:  [ 5 17 78] sum of vector:  100
vec:  [12 29 59] sum of vector:  100
vec:  [ 1 34 65] sum of vector:  100
vec:  [ 3 56 41] sum of vector:  100
vec:  [35 65  0] sum of vector:  100
vec:  [54  9 37] sum of vector:  100
vec:  [45  8 47] sum of vector:  100
vec:  [30 56 14] sum of vector:  100
vec:  [34 63  3] sum of vector:  100
vec:  [17 40 43] sum of vector:  100
vec:  [56 36  8] sum of vector:  100
vec:  [52 45  3] sum of vector:  100
vec:  [35 34 31] sum of vector:  100
vec:  [25 41 34] sum of vector:  100
vec:  [ 1 78 21] sum of vector:  100
vec:  [ 1 49 50] sum of vector:  100
vec:  [51 31 18] sum of vector:  100
vec:  [50 10 40] sum of vector:  100
vec:  [36 63  1] sum of vector:  100
vec:  [30 30 40] sum of vector:  100
vec:  [27 30 43] sum of vector:  100
vec:  [21 27 52] sum of vector:  100

需要检查结果向量和是否确实为所需值,因为这不能保证

在“最后三个数组”中是什么意思?数组的最后三个值?是否要创建一个数组,其中最后三个元素的总和为100?我认为此解决方案是有效的,但并不完全有效random@DavidS我不是统计专家,但当然,如果三个数字加起来是100,其中一个根本不是随机的。。。无论如何,我也喜欢你的解决方案。你的答案我很容易理解,但我的问题是数组的每个值都必须在特定范围内随机,即第一个数组(0100)、第二个数组(0,50)、第三个数组(0,1),并且必须等于100。有可能的解决方案吗?所以你需要三个数字,一个在[0100]范围内,另一个在[0,50]范围内,另一个在[0,1]范围内,总和必须为100?整数还是浮点?尝试了一种解决方案——但请注意,随机性非常小,基本上只有一个随机数,另一个或多或少是固定的(±1取决于第三个数字的值,0或1)。