2016-08-11 10 views
4

Ich muss ein 8x8 Gitter erstellen und verteilen 10 Münzen in zufälligen Positionen auf dem Gitter. Das Problem, mit dem ich konfrontiert bin, ist, dass die Randint-Funktion manchmal die gleichen Zufallskoordinaten erzeugt und daher nur 9 oder 8 Münzen generiert und auf das Gitter gelegt werden. Wie kann ich sicherstellen, dass dies nicht passiert? Cheers :) Das ist mein Code so weit:Wie erstelle ich 10 zufällige x, y Koordinaten in einem Gitter mit Python

from random import randint 

grid = [] 
#Create a 8x8 grid 
for row in range(8): 
    grid.append([]) 
    for col in range(8): 
     grid[row].append("0") 

#create 10 random treasure chests 
    #problem is that it might generate the same co-ordinates and therefore not enough coins 
for coins in range(10): 
    c_x = randint(0, len(grid)-1) 
    c_y = randint(0, len(grid[0])-1) 
    while c_x == 7 and c_y == 0: 
      c_x = randint(0, len(grid)-1) 
      c_y = randint(0, len(grid[0])-1) 
    else: 
     grid[c_x][c_y] = "C" 

for row in grid: 
print(" ".join(row)) 

I enthalten sind, eine Weile/andere - da es keine Münze in der linken unteren Ecke des Rasters

+0

Muss der Algorithmus auf höhere Dimensionen skaliert werden, oder wird er ein 8x8 Raster mit 10 Münzen bleiben? Die Antworten sind bisher gültige Antworten für Ihren Fall, aber verschiedene Ansätze könnten erforderlich sein, wenn Sie planen, mehr Münzen zu platzieren oder ein Gitter mit höherer Dimension zu haben. –

+0

Hi @PatrikH Ja, das Raster wird Optionen haben, die später im Programm erweitert werden und enthalten mehr Münzen. Wenn ich das Gitter in einer Funktion erstelle und die 8 für einen Parameter/ein Argument ersetze, sollte das richtig funktionieren? ;/ –

+0

Ja, das funktioniert. Die Qualität der Antwort auf Ihre Frage hängt jedoch von der Domäne des Problems ab. Die Komplexität des Algorithmus ist für kleinere Problemgrößen wie Ihr 8x8-Raster-Beispiel nicht so wichtig, wird Ihre Auswahl jedoch für größere Raster erheblich einschränken. Die Antworten, die ich bisher gesehen habe, werden sich mit zunehmender Rastergröße nicht gut verhalten. –

Antwort

1

Sie erneut die Kontrolle hinzufügen könnte sein muss Ihre while Schleife, um sicherzustellen, dass nicht bereits eine Münze an der aktuell gewählten Koordinate vorhanden ist. BTW, Sie könnten auch die Prüfungen vermeiden, die Sie bereits haben, indem Sie den Bereich Ihrer randint direkt an Ihre Bedürfnisse anpassen.

Oder Sie könnten alle möglichen 7 * 7 = 49 Koordinaten erzeugen (die unerwünschten Koordinaten beseitigen) und dann 10 verschiedene zufällig mit der np.random.choice Funktion auswählen.

+0

Vielen Dank @polku - Ich habe auch ein wenig ein wenig Forschung nach Ihrem Vorschlag und haben festgestellt, dass die intertools.combinations_with_replacement oder die intertools.permutations kann auch dazu beitragen, die 49 einzigartigen Koordinaten generieren :) –

+0

Ooh eigentlich würden sie nicht Arbeit!Haha - nur noch ein wenig mehr über sie gelesen ... –

5

Sie möchten also 10 zufällige eindeutige Koordinaten generieren?

können Sie einen Satz verwenden, um zu überprüfen:

cords_set = set() 
while len(cords_set) < 10: 
    x, y = 7, 0 
    while (x, y) == (7, 0): 
     x, y = randint(0, len(grid) - 1), randint(0, len(grid[0]) - 1) 
    # that will make sure we don't add (7, 0) to cords_set 
    cords_set.add((x, y)) 

Dies wird eine Menge von Tupeln erzeugen, die (x, y) Koordinaten darstellen.

Einige Beispiele für die Ausgabe von print(cords_set):

{(5, 6), (7, 6), (4, 4), (6, 3), (7, 4), (6, 2), (3, 6), (0, 4), (1, 7), (5, 2)} 

{(7, 3), (1, 3), (2, 6), (5, 5), (4, 6), (3, 0), (0, 7), (2, 0), (4, 1), (6, 5)} 

{(1, 2), (1, 3), (6, 7), (3, 3), (4, 5), (4, 4), (6, 0), (1, 0), (2, 5), (2, 4)} 
+0

und dann: 'für coords in cords_set: gitter [coords [0]] [coords [1]] = 'C'' –

+0

@ Ev.Kounis Ja, ich glaubte OP, um das selbst zu realisieren :) – DeepSpace

+0

Dank @DeepSpace Ich war nicht bewusst, Set() - das sollte den Trick tun! Ich bin immer noch neu in all dem :) –

0

Blick auf den Code unten:

from random import randint 

grid = [] 
#Create a 8x8 grid 
for row in range(8): 
    grid.append([]) 
    for col in range(8): 
     grid[row].append("0") 

for coins in range(10): 
    c_x = randint(0, len(grid)-1) 
    c_y = randint(0, len(grid[0])-1) 
    while grid[c_x][c_y] == "C": 
     c_x = randint(0, len(grid) - 1) 
     c_y = randint(0, len(grid[0]) - 1) 
    grid[c_x][c_y] = "C" 

Die nach den Koordinaten Erzeugen Sie dort stellen Sie sicher, überprüfen, um nicht ‚C‘ in platzieren, bevor Sie ihm einen zuweisen. Wenn es Sie gibt, zeichnen Sie erneut und überprüfen Sie erneut. Wenn nicht, weisen Sie einen zu und zeichnen den nächsten.

Lassen Sie mich wissen, ob das hilft ☺

5

Sie haben nur 64 Fälle, so dass Sie alle Koordinaten als Tupel erzeugen können (x, y) und dann können Sie random.sample verwenden, um direkt 10 einzigartige Elemente müssen, so Sie müssen nicht überprüfen oder neu zeichnen.

import random 
from itertools import product 

g = [['0' for _ in range(8)] for _ in range(8)] 

coord = list(product(range(8), range(8))) 
for coins in random.sample(coord, 10): 
    g[ coins[0] ][ coins[1] ] = 'C' 

for row in g: 
    print(' '.join(row)) 
Verwandte Themen