newbie und Zufallszahlen...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tomy7om
User
Beiträge: 7
Registriert: Dienstag 9. Mai 2017, 06:31

Moin zusammen,

als Neuling habe ich mich jetzt für ein kleines Projekt mit Zufallszahlen beschäftigt - und bin ja soweit erfogreich, dass jede Zahl nur 1x ausgegeben werden darf...
Jetzt habe ich nur die Frage, wie ich die Zahl nicht ausgeben (print) lassen, sondern in eine (bzw. in 6 verschiedene) Variablen speichern kann?!?
Hab schon einiges "Versucht", aber bei mir ähnelt das gerade "Jugend forscht", weil ich vielleicht auf dem Schlauch stehe...

Hier mein Code, der soweit ja auch funzt - vielleicht kann mir ja jemand von euch weiterhelfen,
Danke und Gruß
Tom

Code: Alles auswählen

import random

foo = "1 2 3 4 5 6".split()

def random_elements(li):  
    li = li[:]                            
    while li:  
        index = random.randrange(len(li)) 
        element = li.pop(index)            
        yield element

for el in random_elements(foo):  
    print (el)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

die Anforderung ist ungewöhnlich, da man der Ergebnis eigentlich wenn eher wieder in einer Liste speichern würde und dann per Index darauf zugreift.
Dazu müsstest du eine neue, leere Liste anlegen und mit der `append()`Methode von Listen hinzufügen.

Wenn du eine _bestehende_ Liste zufällig neu ordnen willst, geht das auch einfacher:

[codebox=pycon file=Unbenannt.txt]>>> import random
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> random.shuffle(my_list)
>>> my_list
[1, 4, 6, 5, 2, 3]
[/code]

Per unpacking kannst du die Werte der Liste Variablen zu ordnen:
[codebox=pycon file=Unbenannt.txt]>>> a, b, c, d, e, f = my_list
>>> a
1
>>> d
5[/code]

Oder, wenn du eine Funktion hättest, die sechs Zahlen als Argument erwartet:

Code: Alles auswählen

name_der_funktion(*my_list)
Das `li=li[:]` in deinem Code macht eigentlich auch keinen Sinn, weil die eine Kopie der Liste dem gleichen Variablennamen zuweist.

Gruß, noisefloor

----------
EDIT: Nachtrag - wenn du eine neue Liste auf einer bestehenden willst, dann geht das so:

Code: Alles auswählen

my_new_list = random.sample(my_list, len(my_list))
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@tomy7om: für das, was Du da programmiert hast, gibt es schon etwas fertiges: random.shuffle. Wenn Du Deine Werte speichern willst, nimmst Du eine Liste und da Du schon einen Generator hast, reicht ein Aufruf von List:

Code: Alles auswählen

import random
 
def random_elements(li):  
    li = li[:]                            
    while li:  
        index = random.randrange(len(li))
        element = li.pop(index)            
        yield element
 
foo = "1 2 3 4 5 6".split()
elements = list(random_elements(foo))
oder eben kurz:

Code: Alles auswählen

import random
 
elements = "1 2 3 4 5 6".split()
random.shuffle(elements)
@noisefloor: die Kopie von li ist nötig, weil random_elements die Liste kaputt macht. Besser als [:] wäre natürlich list(li), damit auch andere Container-Klassen verwendet werden können.
tomy7om
User
Beiträge: 7
Registriert: Dienstag 9. Mai 2017, 06:31

...schon mal Danke für die schnellen Antworten - bin gerade auf Arbeit, werde das aber zeitnah testen bzw, umsetzen...
tomy7om
User
Beiträge: 7
Registriert: Dienstag 9. Mai 2017, 06:31

Super,
klappt ja einwandfrei... und so einfach ;-) (das print am Ende mache ich jetzt nur zum Testen; kommt dann wieder raus...)

Gibt es jetzt noch eine elegantere Möglichkeit, die Variablen SR1... dem System bekannt zu machen? ...sicher doch!?!

Gruß Tom

Code: Alles auswählen

import random
SR1 = 0
SR2 = 0
SR3 = 0
SR4 = 0
SR5 = 0
SR6 = 0

my_list = [1, 2, 3, 4, 5, 6]
random.shuffle(my_list)
print (my_list)

SR1 = my_list[0]
SR2 = my_list[1]
SR3 = my_list[2]
SR4 = my_list[3]
SR5 = my_list[4]
SR6 = my_list[5]

print (SR1)
print (SR2)
print (SR3)
print (SR4)
print (SR5)
print (SR6)
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

tomy7om hat geschrieben:Gibt es jetzt noch eine elegantere Möglichkeit, die Variablen SR1... dem System bekannt zu machen? ...sicher doch!?!
Ja, indem man die Nummerierung einzelner Bezeichner ganz schnell wieder vergisst. Belasse es einfach bei der Liste. Wenn du mal die einzelnen Elemente der Liste auf einem Schlag benötigst, dann eignet sich der *-Operator ganz gut. Hier mal demonstriert mit print() als Beispiel:

Code: Alles auswählen

print(*my_list, sep='\n')
# entspricht:
print(my_list[0], my_list[1], ..., sep='\n')
(intern wird AFAIK kein Indexzugriff gemacht, sondern die Liste wird als iterierbares Objekt angesehen, von der das nächste Element geholt wird)
Antworten