python - 如何在不进入无限迭代的情况下继续生成随机值直到满足给定的条件?
问题描述
我正在尝试为满足某些条件的某些目的生成随机值。例如,两个变量“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))
没有错误,但我需要知道一些改进的逻辑语句。
解决方案
生成所有可能值的两个数组:
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
推荐阅读
- magento - 如何重置magento 2中的排序
- function - 如何通过 Google 表格脚本使用过滤器工具
- reactjs - 错误:使用 MaterialTable 时挂钩调用无效
- json - 检查 BigQuery 中是否存在 JSON 键
- spring-boot - 带有 spring boot 石英调度器的控制器 - 集成测试
- drupal-8 - 防止匿名用户访问组页面drupal 8?
- flutter - 了解 Flutter + Material 应用程序中使用的默认样式
- android - 如何在颤动列表视图中显示以前的流内容和当前内容?
- java - 无效的 XPath 查询 - 在 Java 上使用 jcabi
- python - 使用 FiPy 求解椭圆 PDE