【问题标题】:Random Function随机函数
【发布时间】:2018-06-23 08:54:37
【问题描述】:

我想创建一个包含随机字符串的 for 循环。 我希望名称不要重复,价格可能会出现两次(我们有 5 个人,有 2 个钻孔电机和 2 个直流电机要赠送)。 因此,4 人将获得价格,2 人获得钻机,2 人获得直流电机。

我该怎么做?因为当我运行时,random.sample 每次运行循环的一部分时都会重复,并且某些名称和价格出现得太频繁了。因此,我希望名称出现一次,每个价格出现两次。

这是代码:

import random

price=["You have won the drill-motor" , "You have won the DC motor"]

Names = ["Hilmi", "Joris", "Isa", "Dennis", "Jasper"]

for i in range (len(Names)-1):
    print(*random.sample(Names,1), *random.sample(price,1))

【问题讨论】:

  • 您所描述的不是随机的,而是排列。我理解正确吗?
  • 你不妨用random.choice(Names)代替*random.sample(Names, 1)
  • 仅供参考 price 是您必须支付的,您可以赢得的称为 prize

标签: python function random


【解决方案1】:

最简单的方法是 shufflezip 适当的列表:

import random

names = ["Hilmi", "Joris", "Isa", "Dennis", "Jasper"]
prices = 2 * ["You have won the drill-motor" , "You have won the DC motor"]

random.shuffle(names)
random.shuffle(prices)  
# shuffling prices is not strictly necessary
# the random name order already guarantees everybody's fair chance ;)

for name, price in zip(names, prices): 
    print(name, price)

# Hilmi You have won the DC motor
# Jasper You have won the drill-motor
# Dennis You have won the DC motor
# Joris You have won the drill-motor

【讨论】:

  • 谢谢,我不知道zip功能,做了一些研究,现在我明白了!但还有一个问题:在我洗牌后,每次打印姓名时,我总是得到一个洗牌的名单吗?
  • @jan shuffle 对列表进行就地洗牌。所以原来的名单现在是并且仍然是洗牌的。但是,如果这就是您的意思,它不会在您每次打印时神奇地重新洗牌:)
【解决方案2】:

您可以在开头打乱名称列表,然后对其进行一次迭代。 此外,当只选择一项时,random.choice 是比random.sample 更好的选择。 这是代码

import random
price = ["You have won the drill-motor" , "You have won the DC motor"]
names = ["Hilmi", "Joris", "Isa", "Dennis", "Jasper"]
shuffled_names = names[:]  # create a copy if you want original order preserved
random.shuffle(shuffled_names)
for name in shuffled_names:
    print(name, random.choice(price))

【讨论】:

  • 这不能确保两个价格都赢了两次。
  • 我们不需要确保价格必须出现两次。问题是价格可以出现两次。价格允许出现两次。不是必要条件。
猜你喜欢
  • 2014-04-27
  • 2013-01-28
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2014-03-27
  • 2016-05-02
相关资源
最近更新 更多