生成一组带有一定保证存在的半随机数

时间:2019-01-01 08:35:04

标签: python-3.x random

我正在尝试创建一个Python 3脚本,该脚本打印出所有可能的6个数字集,其中4个是固定的(必须出现),但可以出现在6个数字的任何位置。必须都在0到9之间。

例如,如果“固定”数字为1,2,3,4,则可以接受1,2,4,3,5,7,也可以接受1,2,3,3,4,4,但是可以使用0,4,3,7,8,28,0,5,6,7,8也不应该打印。

到目前为止,我已经尝试过解决这个问题,但是在概念上理解确切地从何处开始时遇到了障碍。

到目前为止,我已经尝试使用random.sample,仅显示所选择的数字是否在范围内,但最终确定它不合适,并且我很可能在这里吠叫了错误的树。 (我意识到下面的方法不是最佳的,只是试图找到一个可行的解决方案。这仅用于我个人生成6位数的军用地图坐标的前提,只要它有效,我就不会过分关心它的外观)< / p>

import random
count = 0
while count < 4:
    res = random.sample([0, 1, 2, 3, 4, 5, 6, 7, 8, 9],  6)
    if [0, 0, 2, 8] in res:
        print(res);
        count += 1

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

以下内容获取指定的固定值列表,确定需要多少个附加随机数,并将其附加,然后将其洗牌并返回。

import random

def generate_set(fixed_vals = [1, 2, 3, 4], length = 6, min = 0, max = 9):
    for _ in range(length - len(fixed_vals)):
        fixed_vals.append(random.randint(min, max))
    random.shuffle(fixed_vals)
    return fixed_vals

print(generate_set())  # produces, e.g., [0, 3, 4, 8, 2, 1]

答案 1 :(得分:0)

我的解决方案针对应该包含0, 0, 2, 8(为此序列指定的权重)的序列。该解决方案可以进一步推广。

def generate_sequence(weights):
    return random.choices([0,1,2,3,4,5,6,7,8,9], weights=weights, k=6)

def check_sequence(sequence, check):
    return check(sequence)

def check():
   # TODO: Add your own implementation of sequence checker
   pass

# You could play with weights to generate sequence with higher probability
weights = [4,1,2,1,1,1,1,1,2,1]  
sequence = generate_sequence(weights)

while check_sequence(sequence, check):
    sequence = generate_sequence(weights)