在python中使用specefic项生成随机列表

在python中使用specefic项生成随机列表,python,random,Python,Random,我需要生成一个随机填充的固定大小的整数列表,只使用一些预定义的数字进行选择。此外,这个新列表中的数字之和必须等于给定的数字 例如:随机重复这3个数字-2,2,3,创建一个大小为20的新列表,列表项的总和必须为60。在本例中,size=20、sum=60和数字=[-2,2,3]是输入 我可以用python来做这个吗 import numpy as np def sum_to_x(n, x): values = [0.0, x] + list(np.random.uniform(high

我需要生成一个随机填充的固定大小的整数列表,只使用一些预定义的数字进行选择。此外,这个新列表中的数字之和必须等于给定的数字

例如:随机重复这3个数字
-2
2
3
,创建一个大小为
20
的新列表,列表项的总和必须为
60
。在本例中,
size=20
sum=60
数字=[-2,2,3]
是输入

我可以用python来做这个吗

import numpy as np


def sum_to_x(n, x):
    values = [0.0, x] + list(np.random.uniform(high=x, size=n - 1))
    values.sort()
    return [values[i + 1] - values[i] for i in range(n)]


d = sum_to_x(20, 60)
print(d)
print(sum(d))
输出:

[1.1666321716192374, 3.7356682360404636, 0.10213495009527396, 15.944355221343475, 4.823749563474106, 2.771274835477797, 1.1543877569990038, 6.6231006904687675, 1.0517272997350275, 6.954578248764335, 0.9446793094979142, 2.079080332702951, 1.1813248101489293, 3.3584697034830597, 0.8048689399051554, 1.3952223726127002, 4.797652596772288, 0.30201710006423355, 0.5143495684426824, 0.29472629235259973]
60.0
对于整数值:

import random as r

def random_sum_to(n, num_terms=None):
    num_terms = (num_terms or r.randint(2, n)) - 1
    a = r.sample(range(1, n), num_terms) + [0, n]
    list.sort(a)
    return [a[i + 1] - a[i] for i in range(len(a) - 1)]


print(random_sum_to(60, 20))
[3, 3, 4, 1, 2, 5, 4, 1, 4, 2, 1, 2, 1, 2, 1, 3, 6, 1, 12, 2]
60
输出:

import random as r

def random_sum_to(n, num_terms=None):
    num_terms = (num_terms or r.randint(2, n)) - 1
    a = r.sample(range(1, n), num_terms) + [0, n]
    list.sort(a)
    return [a[i + 1] - a[i] for i in range(len(a) - 1)]


print(random_sum_to(60, 20))
[3, 3, 4, 1, 2, 5, 4, 1, 4, 2, 1, 2, 1, 2, 1, 3, 6, 1, 12, 2]
60
输出:

[1.1666321716192374, 3.7356682360404636, 0.10213495009527396, 15.944355221343475, 4.823749563474106, 2.771274835477797, 1.1543877569990038, 6.6231006904687675, 1.0517272997350275, 6.954578248764335, 0.9446793094979142, 2.079080332702951, 1.1813248101489293, 3.3584697034830597, 0.8048689399051554, 1.3952223726127002, 4.797652596772288, 0.30201710006423355, 0.5143495684426824, 0.29472629235259973]
60.0
对于整数值:

import random as r

def random_sum_to(n, num_terms=None):
    num_terms = (num_terms or r.randint(2, n)) - 1
    a = r.sample(range(1, n), num_terms) + [0, n]
    list.sort(a)
    return [a[i + 1] - a[i] for i in range(len(a) - 1)]


print(random_sum_to(60, 20))
[3, 3, 4, 1, 2, 5, 4, 1, 4, 2, 1, 2, 1, 2, 1, 3, 6, 1, 12, 2]
60
输出:

import random as r

def random_sum_to(n, num_terms=None):
    num_terms = (num_terms or r.randint(2, n)) - 1
    a = r.sample(range(1, n), num_terms) + [0, n]
    list.sort(a)
    return [a[i + 1] - a[i] for i in range(len(a) - 1)]


print(random_sum_to(60, 20))
[3, 3, 4, 1, 2, 5, 4, 1, 4, 2, 1, 2, 1, 2, 1, 3, 6, 1, 12, 2]
60

你可以这样做,但你应该知道这是一个复杂的问题,以解决它的最佳时间

我只能给你一个随机的解决方案,在某些情况下可能需要很多时间,因为它是随机的:

import random

def create_list(possible_values, size, sum_of_values, max_iterations=10**5):
    for i in range(max_iterations):
        values = [
            random.choice(possible_values)
            for _ in range(size)]

        if sum(values) == sum_of_values:
            # only exit once it reaches the goal
            print('solution found after {:,d} iterations'.format(i))
            return values

    raise ValueError(
        'no solution found after {:,d} iterations'.format(max_iterations))
这是一个示范;相同的参数在每次调用函数时可能具有不同的持续时间

>>> create_list([-1, 0, 1, 2, 3], 20, 30)
solution found after 38 iterations
[1, 2, 1, 1, 1, 3, 2, 2, 3, 2, 3, 2, 1, 1, -1, 0, 0, 2, 2, 2]
>>> create_list([-1, 0, 1, 2, 3], 20, 30)
solution found after 31 iterations
[2, 2, 3, 0, 3, 1, 1, 1, 3, 3, 1, 1, 0, 2, 1, -1, 3, 3, 0, 1]
>>> create_list([-1, 0, 1, 2, 3], 20, 30)
solution found after 93 iterations
[2, -1, 2, 1, 3, 2, -1, 0, 2, -1, 3, 3, 2, 2, 3, 1, 1, 0, 3, 3]

>>> create_list([-1, 0, 1, 2], 20, 30)
solution found after 50,456 iterations
[1, 2, 2, 2, 2, 2, 2, 2, -1, 2, 1, 0, 2, 2, 2, 2, 2, 0, 2, 1]
如果失败,您可以用更多的迭代次数重试,但这并不总能解决问题:

>>> create_list([-1, 0, 1], 20, 30)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/ralf/PycharmProjects/django_test_02/run_pw.py", line 20, in create_list
    'no solution found after {:,d} iterations'.format(max_iterations))
ValueError: no solution found after 100,000 iterations

>>> create_list([-1, 0, 1], 20, 30, 10**6)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/ralf/PycharmProjects/django_test_02/run_pw.py", line 20, in create_list
    'no solution found after {:,d} iterations'.format(max_iterations))
ValueError: no solution found after 1,000,000 iterations
创建列表([-1,0,1],20,30) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/home/ralf/PycharmProjects/django_test_02/run_pw.py”,第20行,在创建列表中 “在{:,d}次迭代后未找到解决方案”。格式(最大迭代次数)) ValueError:在100000次迭代后未找到解决方案 >>>创建_列表([-1,0,1],20,30,10**6) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/home/ralf/PycharmProjects/django_test_02/run_pw.py”,第20行,在创建列表中 “在{:,d}次迭代后未找到解决方案”。格式(最大迭代次数)) ValueError:在1000000次迭代后未找到解决方案
您可以这样做,但您应该知道,要在最佳时间内解决这一问题是一个复杂的问题

我只能给你一个随机的解决方案,在某些情况下可能需要很多时间,因为它是随机的:

import random

def create_list(possible_values, size, sum_of_values, max_iterations=10**5):
    for i in range(max_iterations):
        values = [
            random.choice(possible_values)
            for _ in range(size)]

        if sum(values) == sum_of_values:
            # only exit once it reaches the goal
            print('solution found after {:,d} iterations'.format(i))
            return values

    raise ValueError(
        'no solution found after {:,d} iterations'.format(max_iterations))
这是一个示范;相同的参数在每次调用函数时可能具有不同的持续时间

>>> create_list([-1, 0, 1, 2, 3], 20, 30)
solution found after 38 iterations
[1, 2, 1, 1, 1, 3, 2, 2, 3, 2, 3, 2, 1, 1, -1, 0, 0, 2, 2, 2]
>>> create_list([-1, 0, 1, 2, 3], 20, 30)
solution found after 31 iterations
[2, 2, 3, 0, 3, 1, 1, 1, 3, 3, 1, 1, 0, 2, 1, -1, 3, 3, 0, 1]
>>> create_list([-1, 0, 1, 2, 3], 20, 30)
solution found after 93 iterations
[2, -1, 2, 1, 3, 2, -1, 0, 2, -1, 3, 3, 2, 2, 3, 1, 1, 0, 3, 3]

>>> create_list([-1, 0, 1, 2], 20, 30)
solution found after 50,456 iterations
[1, 2, 2, 2, 2, 2, 2, 2, -1, 2, 1, 0, 2, 2, 2, 2, 2, 0, 2, 1]
如果失败,您可以用更多的迭代次数重试,但这并不总能解决问题:

>>> create_list([-1, 0, 1], 20, 30)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/ralf/PycharmProjects/django_test_02/run_pw.py", line 20, in create_list
    'no solution found after {:,d} iterations'.format(max_iterations))
ValueError: no solution found after 100,000 iterations

>>> create_list([-1, 0, 1], 20, 30, 10**6)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/ralf/PycharmProjects/django_test_02/run_pw.py", line 20, in create_list
    'no solution found after {:,d} iterations'.format(max_iterations))
ValueError: no solution found after 1,000,000 iterations
创建列表([-1,0,1],20,30) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/home/ralf/PycharmProjects/django_test_02/run_pw.py”,第20行,在创建列表中 “在{:,d}次迭代后未找到解决方案”。格式(最大迭代次数)) ValueError:在100000次迭代后未找到解决方案 >>>创建_列表([-1,0,1],20,30,10**6) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/home/ralf/PycharmProjects/django_test_02/run_pw.py”,第20行,在创建列表中 “在{:,d}次迭代后未找到解决方案”。格式(最大迭代次数)) ValueError:在1000000次迭代后未找到解决方案
是的,你可以用python做,如果你尝试的话你可以@Nihal我试过了,但我想可能需要一个启发式算法来解决这个问题,你认为呢?@AmitNanaware带有一个库?@Aprilis是的,你可以使用..是的,你可以用python做,如果你尝试的话你可以@Nihal我试过了,但我认为可能需要一个启发式算法来解决这个问题,你认为呢?@AmitNanaware with a library?@Aprilis是的,你可以使用..问题表明输入的数字是作为参数给出的;这个解决方案没有考虑到这一点。我没有注意到,问题表明输入的数字是作为参数给出的;这个解决方案没有考虑到这一点。我没有注意到,