2016-10-04 16 views
2

ランダムに生成された爆弾で掃海艇の試合をしています。しかし、時々私は爆弾の座標の私のリストに重複があることを発見しました。リスト内の重複をチェックし、他のランダムな座標に置き換えるにはどうすればよいですか。ランダムに生成されたリストの重複をチェックして置き換えてください。

from random import randint 

def create_bombpos(): 
    global BOMBS, NUM_BOMBS, GRID_TILES 
    for i in range(0, NUM_BOMBS): 
     x = randint(1, GRID_TILES) 
     y = randint(1, GRID_TILES) 
     BOMBS.append((x, y)) 
    print(BOMBS) 

ユーザはGRID_TILESの入力によってボードの大きさを決めることができます。 5を入力すると、ボードは5x5になります。爆弾のammountは次のとおりです。

GRID_TILES * GRIDTILES/5 

答えて

3
from random import randint 

def create_bombpos(): 
    global BOMBS, NUM_BOMBS, GRID_TILES 
    i = 0 
    while i<NUM_BOMBS: 
     x = randint(1, GRID_TILES) 
     y = randint(1, GRID_TILES) 
     if (x,y) not in BOMBS 
      BOMBS.append((x, y)) 
      i = i + 1 
    print(BOMBS) 

新しく生成されたポイントがリストに既にある場合は、iがインクリメント得ることはありません、それが中には存在しないまで私たちは、別の新しく生成されたポイントを見つけるだろうBOMBS

希望すると助かります!

+0

ありがとうございました、これは助けているようです!できるだけ早く答えを受け入れます。 –

4

BOMBS全体のリストを検索するたびにO(n)(リニア時間)がかかります。代わりにsetを使用してみませんか? Setは、(ハッシュの点で)別個の要素で終わることを保証します。

>>> a = set() 
>>> a.add((1,2)) 
>>> a 
{(1, 2)} 
>>> a.add((1,2)) 
>>> a.add((1,3)) 
>>> a.add((1,2)) 
>>> a 
{(1, 2), (1, 3)} 

は私がセットに何回も同じ要素を追加することができますが、1つだけのインスタンスが存在することになる。

from random import randint 

def create_bombpos(): 
BOMBS = set() 
i = 0 
while i<NUM_BOMBS: 
    x = randint(1, GRID_TILES) 
    y = randint(1, GRID_TILES) 
    if (x,y) not in BOMBS 
     BOMBS.add((x, y)) 
     i = i + 1 
print(BOMBS) 

私はUにセットの例を挙げてみましょう。

+1

セットを使用すると、(x、y)がBOMBSに入っているかどうかチェックするのはなぜですか? –

+1

良いキャッチ@maximilianPeters。コピーn個のペーストのうち残っている。 – sestus

+0

とにかく、彼は走っている時間を気にしていないようです:) – sestus

0

このためにPythonセットを使用すると、重複を自動的にチェックし、すでにリストにあるすべてのエントリを無視します。 私はまた、ランタイムがリストを使って手動で重複をチェックするよりもはるかに良いと思います。

リンク:https://docs.python.org/2/library/sets.html

3

ます。また、これを達成するためにrandom.sampleを使用することができます。

from random import sample 

GRID_TILES = 100 
NUM_BOMBS = 5 

indexes = sample(range(GRID_TILES * GRID_TILES), NUM_BOMBS) 
BOMBS = [(i // GRID_TILES, i % GRID_TILES) for i in indexes] 
+1

ベストソリューションIMHOは、1行に短縮することもできます。サンプルはすべての位置が一意であることを確認するため、位置が存在するかどうかはチェックされません。 –

関連する問題