除了之前列出的数字,生成随机数

3

我知道如何从7到14中获取随机数字,但是是否可以在排除之前写好的某些数字的情况下,从7到14中获取随机数字呢?

例如:

Forbidden = [12, 13, 8, 7]
a = randint(7, 14) 

a 应该是一个随机数,但不应该是 Forbidden 中列出的数字。

编辑:感谢建议,使用 while 循环或 .choice 实际上解决了我的问题。但最终 @user2357112 是正确的,显然黑名单想法是初学者的陷阱,洗牌一副牌解决了我的问题。


2
可能是[生成一个在区间(1,n)内但不在列表(i,j)中的数字]的重复问题(链接:https://dev59.com/t3TYa4cB1Zd3GeqPuGbh)。 - Ishan Srivastava
2
请注意,根据PEP8,不允许以大写字母开头命名变量。 - user6597761
编程/算法的一般问题,与Python无关,请在发布前浏览问题。 - Ishan Srivastava
每次迭代都会增加一个新的随机数,不考虑“禁止”列表增加的可能性是否合理吗? - Edorka
@IshanSrivastava:这里语言确实很重要。OP不想看到用他们不懂的语言展示代码的答案。此外,OP发布的代码是Python,[python]标签有助于语法高亮显示。(另一方面,你提供的重复链接是非常准确的。) - Cris Luengo
@CrisLuengo 这似乎是一个设计问题。一旦需要执行的任务集合清晰明确,就可以使用任何语言执行,但无论如何... - Ishan Srivastava
5个回答

5
你知道真正的纸牌游戏是如何防止你抽到已经抽过的牌吗?它不是通过一个已抽牌的黑名单来实现的,而是通过一副牌,并对其进行洗牌。
在程序中也可以这样做。不需要试图维护一个已经抽过的牌的黑名单,而是在程序开始时对一副牌进行洗牌,并从其中抽取牌。
import random

deck = some_list
random.shuffle(deck)

# when you want to draw a card
card = deck.pop()

返回一个不在列表中的随机变量。 - Ishan Srivastava
2
@IshanSrivastava:提问者特别想编写一款纸牌游戏:“我基本上是个初学者,正在尝试让一款纸牌游戏运行。”这个黑名单的想法是一个常见的初学者陷阱,在纸牌游戏问题中经常出现,当人们想要防止抽取重复的卡牌时。 - user2357112

3
您可以使用choice函数:
import random
total_data = [i for i in range(1,15)]
forbidden = [12, 13, 8, 7]
not_forbidden =[i for i in total_data if i not in forbidden] #make a list of not forbidden numbers
a = random.choice(not_forbidden) #select value which is between 7 and 14 and not in forbidden list
print(a)

或者你可以编写自己的自定义函数:
import random
Forbidden = [12, 13, 8, 7]
def get_number(forbidden_list):
    while True:
        a = random.randint(7,14)
        if a not in forbidden_list: #if this number if not forbidden list then break the loop and return the value
            return a
result = get_number(Forbidden)
print(result)

1
你可以尝试使用 random.choice()

import random
...
not_forbidden = [1,2,3,4]
a = random.choice(not_forbidden)

并不是这样,这就是为什么存在像 range() 这样的函数 :) - Gustavo Topete

0
from random import randint
Forbidden = [12, 13, 8, 7]
a = randint(7, 14)
while a in Forbidden: a = randint(7, 14)

使用while循环,不断获取新的随机数,直到该数字不在禁止列表中。

需要进行解释。 - Peter Mortensen

0

我知道在 randint 命令中你不能这样做,但你可以使用 while 循环来实现:

while a in forbidden:
  a = randint(7, 14)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接