首页 > 解决方案 > 如何在不进入无限迭代的情况下继续生成随机值直到满足给定的条件?

问题描述

我正在尝试为满足某些条件的某些目的生成随机值。例如,两个变量“a”和“b”,条件是 a+b>30,我想要 a 和 b 的随机值。问题是我面临一个无限循环,因为它无法满足条件。

我曾经eval()评估条件,因为我的条件是字符串格式。我试过使用random.randrange.

var=[{a:'Value',b:'Value'},{},{}]
cond=[['a+b>20'],[],[]]

class check_condition:

    def condition(self,cond,var,i):
        for k,v in var[i].items():
                exec("%s=%s" % (k,v))

        for j in range(len(cond[i])):
            while eval(cond[i][j])==False:
                reassign(var,i)


class variable:

    def assign(self,var):
        for i in range(len(var)):
            for k,e in var[i].items():
                var[i].add(k,random.randrange(10,30))


    def reassign(self,var,i):
        for k,e in var[i].items():
            #print("Reassigning")
            var[i].add(k,random.randrange(10,30))

没有错误,但我需要知道一些改进的逻辑语句。

标签: pythonpython-3.x

解决方案


生成所有可能值的两个数组:

as = range(10,30)
bs = range(10,30)

选择两个随机值:

a = random.choice(as)
b = random.choice(bs)

检查您的条件,如果为假,则弹出这两项并继续循环:

as.remove(a)
bs.remove(b)

更新 - 这不是一个好的解决方案,因为它只允许 400 种组合中的 20 种。

除此之外(或者更准确地说 - 作为结果),它也可能在没有成功的情况下结束。

所以这里有一个更完整的解决方案,它从所有可能的组合中随机选择:

import random

aa = range(10,30)
bb = range(10,30)

combinations = [(a,b) for a in aa for b in bb]

while True:
    (a,b) = random.choice(combinations)
    if a+b == 30:
        print(a,b)
        break

推荐阅读