为了账号安全,请及时绑定邮箱和手机立即绑定

优化 Python 中不包括值列表的数字的随机化

优化 Python 中不包括值列表的数字的随机化

富国沪深 2023-09-12 16:33:15
我需要生成一个介于最小值和最大值之间的随机数。这个数字应该是10的倍数。这是我得出的解决方案。import randomBLOCK = 10def random_excluding_values(_min, _max, exclude_list):while True:    random_number = round(random.randrange(_min, _max - BLOCK) / BLOCK) * BLOCK    if random_number not in exclude_list:        return random_number有没有办法使用列表列表理解或其他方式获得相同的结果?
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

计算时下限包括 10 的倍数range。跳过 while 循环可确保您不会陷入无限循环。转换为集合可确保您知道可以获得什么。


import random


def random_excluding_values(_min, _max, exclude_list, num_of_elems):

    lower_bound = round(_min+4, -1)    

    all_nums = {num for num in range(lower_bound, _max+1, 10)}


    exclude_set = set(exclude_list)

    valid_choices = all_nums - exclude_set

    

    return random.sample(valid_choices, num_of_elems)



_min = 9

_max = 103

exclude_list = [40,50,60,70]

#valid_list = [10,20,30,80,90,100]

num_elems = 3 


for i in range(5):

    print(f'run = {i}; result = {random_excluding_values(_min, _max, exclude_list, num_elems)}')

输出:


run = 0; result = [80, 30, 20]

run = 1; result = [10, 20, 80]

run = 2; result = [10, 80, 30]

run = 3; result = [100, 90, 10]

run = 4; result = [10, 20, 100]

random.sample返回有效数字集中的选项列表。因此您可以轻松修改以获得单一号码。


return random.sample(valid_choices, 1)[0]


查看完整回答
反对 回复 2023-09-12
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号