2016-11-29 2 views
2

Ich mache ein Programm, in dem ich zufällige Werte in einer Liste erzeugen muss. Der Benutzer wird aufgefordert anzugeben, wie viele zufällige Werte (Kästchen - dargestellt durch den Buchstaben "T") auf einem 2D-Gitter erzeugt werden sollen. Das Problem ist, dass, wenn der Benutzer '8' als die Anzahl von zufälligen 'Truhen' eingibt, die sie erzeugen möchten, manchmal nur 5 oder 6 Kästchen in das Gitter generiert werden (wahrscheinlich, weil sich die zufälligen ganzen Zahlen auf das Gitter wiederholen und nicht Index an eindeutigen Punkten im Raster). Die Anzahl der Truhen wird nie genau im Raster dargestellt. Wie kann ich sicherstellen, dass alle Zufallswerte eindeutigen Indizes im 2D-Raster zugewiesen werden?Generieren von zufälligen Werten in einer Python-Liste, die sich nicht im selben Index wiederholen

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

Können Sie 'numpy' verwenden oder benötigen Sie eine reine Python-Implementierung? – roganjosh

+0

Pure Python-Implementierung. – user3608028

Antwort

6

Es scheint mir, dass Sie alle möglichen Indizes erzeugen müssen und dann eine „Population“ zufällig wählen:

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' 

Dieser endet als O(BOARD_SIZE^2) auf. Dort sind ausgefeiltere Verfahren - z.B. statt, um die gesamte Vorstand der Indizes zu erzeugen, könnte man eine Bevölkerung von einer abgeflachten Bord abtasten und dann die Indizes danach erzeugen:

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' 

Dieser endet als O(chest_count) bis die viel kleiner ist als die Größe der Leiterplatte sein könnte - Ich bezweifle jedoch, dass dein Board tatsächlich groß genug ist, um wichtig zu sein :-).

+0

Sehr elegante Lösung – Shaun

+0

Diese zweite war was ich tippte, als Sie gepostet. Gute Arbeit, in beide Richtungen. – Prune

+0

@ Prune - Ja. Ich dachte, es wäre schwieriger zu implementieren, aber dann erinnerte ich mich an "divmod". Es stellt sich heraus, dass es genau das tut, was wir für ein 2D-Board wollen. Ordentlich. – mgilson

Verwandte Themen