返回重复值的随机数生成器

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

我有一个随机数生成器,我想从字典中返回 7 个键。

我正在使用 random.uniform 生成一个浮点值,该值与字典中的一组值相匹配,这些值是浮点值以生成最接近的值并将相关键返回到该值。

我正在迭代一个列表以添加生成的任何唯一键,但忽略任何重复的键,因为我想最终得到一组随机数字,例如5, 12, 6, 18, 28, 23, 15 不重复的值,例如 5, 12, 5, 15, 23, 12, 5

我生成一组数字的代码有效:

count = 0
    while True:
        if count <= 6:
            number = ran.uniform(0.0, max_key)
            num_gen = min(sorted_countout, key=lambda x:abs(x-(number)))
            snumgen = list()
            if num_gen not in snumgen:
                snumgen.append(num_gen)
                count += 1
            else:
                count += 0
            print(snumgen)
        elif count > 6:
            break

但是它没有生成一组唯一的数字,我仍然在生成的集合中得到重复的值。

另外作为一个单独的问题 - 我如何在循环之外重置计数?它完成了循环,但随后锁定在 6 - 我必须关闭 vscode 才能让它生成一组新的数字 -

注意:在这种质疑中存在一些类似的问题 - 但我更具体地要求在这种情况下找到解决方案,因为它应该产生唯一的数字,但目前还没有。我是一名初级开发人员,感谢您的帮助,因为它帮助我学习!

##这是我的字典的一个例子:

sorted_countout = {1: 17.8343949044586, 2: 21.337579617834397, 3: 21.656050955414013, 4: 19.745222929936308, 5: 19.10828025477707, 6: 20.382165605095544, 7: 23.88535031847134, 8: 17.8343949044586, 9: 21.97452229299363, 10: 20.382165605095}
import random as ran

##this is the function
def choices():
    ##selecting the maximum value in the dict
    max_key = next(iter(sorted_countout))
    for key in sorted_countout:
        if sorted_countout[key] > sorted_countout[max_key]:
            max_key = key
    ##Randomly select a float value in range of 0- max freq of occurrence
    
    count = 0
    while True:
        if count <= 6:
            number = ran.uniform(0.0, max_key)
            num_gen = min(sorted_countout, key=lambda x:abs(x-(number)))
            snumgen = list()
            if num_gen not in snumgen:
                snumgen.append(num_gen)
                count += 1
            else:
                count += 0
            print(snumgen)
        elif count > 6:
            break
python loops random
1个回答
0
投票

那是因为您在循环内实例化列表,因此每个周期都会重置它。另外,您需要在循环后立即将计数器设置回

0

def choices():
    max_key = next(iter(sorted_countout))
    for key in sorted_countout:
        if sorted_countout[key] > sorted_countout[max_key]:
            max_key = key

    count = 0
    snumgen = []  # Move the list initialization outside the loop
    while True:
        if count <= 6:
            number = ran.uniform(0.0, max_key)
            num_gen = min(sorted_countout, key=lambda x:abs(x-(number)))
            if num_gen not in snumgen:
                snumgen.append(num_gen)
                count += 1
            else:
                continue  # Skip duplicate numbers
        else:
            break

    print(snumgen)
    count = 0  # Reset count outside the loop
© www.soinside.com 2019 - 2024. All rights reserved.