用于生成具有约束的随机数集的Python脚本

问题描述 投票:0回答:1

我希望脚本输出“0.04”和“4.5”之间的 159 个随机数,其总数与目标总数相匹配。这是我到目前为止所得到的,但这只生成 142 个数字。我怎样才能强制它创建 159 个数字?

import random

target_total = 298.51
total_numbers = 159
min_value = 0.04
max_value = 4.50

random_numbers = []

for i in range(total_numbers - 1):
    # Generate a random number within the specified range
    num = round(random.uniform(min_value, max_value), 2)  # Limit to 2 decimal places
    
    # Append the number to the list
    random_numbers.append(num)
    
    # Calculate the current sum of numbers
    current_sum = round(sum(random_numbers), 2)
    
    # If the current sum exceeds the target total, remove the last number
    while current_sum > target_total:
        excess = current_sum - target_total
        random_numbers.remove(random_numbers[-1])
        current_sum = round(current_sum - excess, 2)

# The last number is adjusted to reach the target total
last_num = round(target_total - sum(random_numbers), 2)
random_numbers.append(last_num)

# Print each generated number with row numbers on a new line
for i, num in enumerate(random_numbers, start=1):
    print(f"Row {i}: {num}")

print("Total sum:", round(sum(random_numbers), 2))


python-3.x data-manipulation data-generation
1个回答
0
投票

问题在于:虽然max_value是4.50,但是如果在最大值附近创建的随机数较多,那么用较少的总数就可以达到目标总数。另外,如果我们使用这种方法,循环将继续无穷无尽。所以我们必须自己决定max_value。这里我给出了一个更好的方法。里面有解释:

import random as rd
target_total = 298.51
total_numbers = 159
each_number = target_total/total_numbers

#calculate the sum of adjacent two numbers
adj_sum = each_number*2

min_value = 0.04
random_numbers = []

#create a loop 
for i in range(total_numbers):
    #generate random number only for even index
    if i%2==0:
        #generate random_number between min_value and slighltly less than the adj_sum
        # not mentioned the min-val as argument as we have given it as default
        number = rd.uniform(min_value, adj_sum-1)
    #if i is even the random number should be the difference between adj_sum and previous number
    else:
        number = adj_sum - number
    
    #round_off to 2 decimals and append
    random_numbers.append(round(number,2))
'''
In the above loop the total numbers of random numbers created is 1 number 
less than the total numbers required
because for 0 index, the adj_sum-1 will be in negative.
that is the maximum value for 0 index will be a negative number. 
#so we can find out the last number
'''
#find the last number

sum = round(sum(random_numbers), 2)
last_number = round((target_total - sum),2)
sum = sum + last_number
total_numbers = len(random_numbers)


for i, num in enumerate(random_numbers, start=1):
    print(f"Row {i}: {num}")

print("Total sum:", round(sum(random_numbers), 2))
© www.soinside.com 2019 - 2024. All rights reserved.