2016-11-29 5 views
2

ランダムな値をリストに生成する必要があるプログラムを作成しています。ユーザは、2Dグリッド上に生成したい乱数値(文字「T」で表されるチェスト)の数を入力するように求められます。問題は、ユーザーが生成したいランダムな 'chest'の数として '8'を入力すると、グリッドに5つまたは6つのチェストしか生成されないことがある(おそらく、乱数がグリッド上に繰り返され、グリッド内の一意の点でのインデックス)。胸の数は決して正確にグリッドに表示されません。すべてのランダムな値が2Dグリッドの一意のインデックスに割り当てられるようにするにはどうすればよいですか?同じインデックスで繰り返されないPythonリストのランダムな値の生成

def chests(): 
     global chest 
     chest = int(input("How many chests would you like in the game?")) 
     for i in range(0,chest): 
      board[randint(0, 4)][randint(0, 4)] = "T" 


     return board 
+0

'numpy'を使うことができますか、純粋なPython実装が必要ですか? – roganjosh

+0

純粋なPythonの実装。 – user3608028

答えて

6

あなたが可能なすべてのインデックスを生成し、ランダムに「人口」を選択する必要があるように私には思える:

import itertools 
import random 
chest_count = 8 
BOARD_SIZE = 4 
indices = list(itertools.product(range(BOARD_SIZE), repeat=2)) 
chest_locations = random.sample(indices, chest_count) 
for i, j in chest_locations: 
    board[i][j] = 'T' 

これはO(BOARD_SIZE^2)なってしまいます。 は、より洗練された方法です(例:)。むしろ、ボード全体のインデックスを生成する必要よりも、あなたが平坦化されたボードの人口をサンプリングし、その後にインデックスを生成することができます:

locations = random.sample(range(BOARD_SIZE * BOARD_SIZE), chest_count) # xrange on python2.x 
for location in locations: 
    j, i = divmod(location, BOARD_SIZE) 
    board[i][j] = 'T' 

これは、ボードのサイズよりもはるかに小さくすることができO(chest_count)なってしまいます - しかし、私は、あなたのボードが実際には問題になるほど大きいとは思っていません。

+0

非常に優雅な解決策 – Shaun

+0

この2番目のものは、投稿時に入力したものです。ニースの仕事、両方の方法。 – Prune

+0

@プルーン - うん。私はそれが実装するのが難しくなると思ったが、その後私は「divmod」を思い出した。それは、2Dボードのために私たちが望むものとまったく同じであることが判明しました。きちんとした – mgilson

関連する問題