【问题标题】:Index of a random number in a list?列表中随机数的索引?
【发布时间】:2017-10-27 22:34:56
【问题描述】:

所以我在其他地方寻求帮助,但找不到任何解决方案。我创建了一个包含 51 个元素的列表,并希望在该列表中选择 10 个随机的不同位置,并能够更改这些位置的值(您可以在 assignCard(person) 函数下看到这一点)。由于我使用的是数字索引,因此我不能使用诸如random.sample 之类的方法或将随机数放入set(),因为我收到一条错误消息。我已经在下面发布了我的代码,请随意复制并运行它以查看输出,除了重复数字外,一切正常,所以如果可能,请不要在答案中大幅更改代码。

""" cardGame.py
    basic card game framework
    keeps track of card locations for as many hands as needed
"""
from random import *
import random

NUMCARDS = 52
DECK = 0
PLAYER = 1
COMP = 2

cardLoc = [0] * NUMCARDS
suitName = ("hearts", "diamonds", "spades", "clubs")
rankName = ("Ace", "Two", "Three", "Four", "Five", "Six", "Seven", 
            "Eight", "Nine", "Ten", "Jack", "Queen", "King")
playerName = ("deck", "player", "computer")

def main():
  clearDeck()

  for i in range(5):
    assignCard(PLAYER)
    assignCard(COMP)

  print(cardLoc)

  print("#  " + " card      " + " location")
  showDeck()
  print("\nDisplaying player hand:")
  showHand(PLAYER)
  print("\nDisplaying computer hand:")
  showHand(COMP)

def clearDeck():
    cardLoc = [0] * NUMCARDS

def assignCard(person):
  x = random.randint(0, 51)
  cardLoc[x] = person

def showDeck():
  for i in range(NUMCARDS):
    y = rankName[i % 13]
    z = suitName[int(i / 13)]
    a = cardLoc[i]
    b = playerName[a]
    print("{:<4}{:<4} of {:<14}{:<7}".format(str(i), y, z, b))

def showHand(person):
  for i in range(NUMCARDS):
    if cardLoc[i] == person:
      print(rankName[i % 13] + suitName[int(i / 13)])

main()

【问题讨论】:

    标签: python random position indexof


    【解决方案1】:

    由于我使用的是数字的索引,所以我不能使用random.sample等方法

    当然可以:

    >>> import random
    >>> my_list = [0]*10
    >>> my_list
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    >>> idx = list(range(len(my_list)))
    >>> idx
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> s = random.sample(idx, 5)
    >>> s
    [4, 0, 5, 7, 1]
    >>> for i in s:
    ...     my_list[i] = 99
    ...
    >>> my_list
    [99, 99, 0, 0, 99, 99, 0, 99, 0, 0]
    

    在这里,只需执行以下操作:

    >>> NUMCARDS = 52
    >>> cardLoc = [0]*52
    >>> s = random.sample(range(NUMCARDS), 10)
    >>> for i in s[:5]:
    ...     cardLoc[i] = 1
    ...
    >>> for i in s[5:]:
    ...     cardLoc[i] = 2
    ...
    

    现在我只是打印位置:

    >>> for i in range(NUMCARDS):
    ...     if cardLoc[i] == 1:
    ...         print(i)
    ...
    10
    24
    25
    34
    41
    >>> for i in range(NUMCARDS):
    ...     if cardLoc[i] == 2:
    ...         print(i)
    ...
    14
    23
    28
    49
    50
    >>>
    

    或者,加载你的常量:

    >>> NUMCARDS = 52
    >>> DECK = 0
    >>> PLAYER = 1
    >>> COMP = 2
    >>>
    >>> cardLoc = [0] * NUMCARDS
    >>> suitName = ("hearts", "diamonds", "spades", "clubs")
    >>> rankName = ("Ace", "Two", "Three", "Four", "Five", "Six", "Seven",
    ...             "Eight", "Nine", "Ten", "Jack", "Queen", "King")
    >>> playerName = ("deck", "player", "computer")
    >>>
    >>> s = random.sample(range(NUMCARDS), 10)
    >>> for i in s[:5]:
    ...     cardLoc[i] = PLAYER
    ...
    >>> for i in s[5:]:
    ...     cardLoc[i] = COMP
    ...
    >>> def showHand(person):
    ...   for i in range(NUMCARDS):
    ...     if cardLoc[i] == person:
    ...       print(rankName[i % 13] + suitName[int(i / 13)])
    ...
    >>> showHand(PLAYER)
    Threehearts
    Ninehearts
    Sixdiamonds
    Ninediamonds
    Twoclubs
    >>> showHand(COMP)
    Sevenhearts
    Sevendiamonds
    Sixspades
    Queenspades
    Kingclubs
    

    【讨论】:

    • 您好,感谢您对我的帮助。在对我的程序实施您的解决方案后,它有时仍会在玩家手中输出 5 张牌,在计算机手上输出 4 张牌,反之亦然。我还有什么遗漏的吗?
    • @Matteo 我不确定这与您的问题有什么关系。但是,如果您只是想将牌随机分配给两个玩家,random.shuffle 您的牌组,然后每隔一张牌,就像您在现实生活中一样。
    • 我的程序差不多完成了,我只需要修复这个错误,这就是为什么我想在不添加 random.shuffle 的情况下保持我的程序相对相同
    • 也许问题在于函数 assignCard() 的重复,这可能导致列表 random.sample 中的数字等于分配给玩家或计算机的同一列表中的数字。
    • @Matteo 是的,显然。这就是为什么你应该洗牌和交易......
    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多