Seite 1 von 1
Frage: random ohne Doppelung?
Verfasst: Samstag 19. Mai 2018, 21:18
von pythonbeginner2000
Hallo Freunde,
ich versuche etwas Python zu lernen.
Jedoch stelle ich fest, dass ich nicht weiterkomme.
Es entstehen immer Probleme.
Ich erhalte immer wieder Doppelungen.
Ich hoffe hier kann mir jemand weiter helfen.
Vielen Dank im Voraus.
import random
x = random.randint(1,6)
x1 = random.randint(1,6)
x2 = random.randint(1,6)
x3 = random.randint(1,6)
x4 = random.randint(1,6)
x5 = random.randint(1,6)
if x==(x1,x2,x3,x4,x5):
x = random.randint(1, 6)
if x1==(x,x2,x3,x4,x5):
x1 = random.randint(1, 6)
if x2==(x,x1,x3,x4,x5):
x2 = random.randint(1, 6)
if x3==(x,x1,x2,x4,x5):
x3 = random.randint(1, 6)
if x4==(x,x1,x2,x3,x5):
x4 = random.randint(1, 6)
if x5==(x,x1,x2,x3,x5):
x5 = random.randint(1, 6)
print('Zahl x : \t',x)
print('Zahl1 x1: \t',x1)
print('Zahl2 x2: \t',x2)
print('Zahl3 x3: \t',x3)
print('Zahl4 x4: \t',x4)
print('Zahl5 x5: \t',x5)
Re: Frage: random ohne Doppelung?
Verfasst: Samstag 19. Mai 2018, 21:31
von Sirius3
Vergleiche von int mit tuple sind immer False. Was Du suchst, ist der ›in‹-Operator. Da Du aber n Zahlen aus einer Menge m ziehen, nimm doch ›random.sample‹:
Re: Frage: random ohne Doppelung?
Verfasst: Sonntag 20. Mai 2018, 16:10
von pythonbeginner2000
Super, vielen Dank für deine Hilfe.
Jetzt klappt es mit der Ausgabe.
Jetzt würde ich gerne wissen, wie ich die Ausgabe 10 mal wiederholen kann, dass ich 10 Ergebnisse habe.
zahlen = random.sample(range(1,50), 6)
zahlen1 = random.sample(range(1,50), 6)
Ich habe es untereinander aufgeschrieben, jedoch geht das bestimmt eleganter oder?
Vielen Dank im Voraus.
Re: Frage: random ohne Doppelung?
Verfasst: Sonntag 20. Mai 2018, 16:32
von Sirius3
Verwende Listen und Schleifen.
Re: Frage: random ohne Doppelung?
Verfasst: Sonntag 20. Mai 2018, 19:23
von pythonbeginner2000
Ich verstehe.
Kann einer mir sagen, was an meinen Code falsch sein soll?
import random
i= int
i=0
while i < 10:
zahlen = random.sample(range(1,100), 5)
i=i+1
zahlen.sort
print(zahlen)
Fehlermeldung:
while i < 10:
^
IndentationError: unexpected indent
Re: Frage: random ohne Doppelung?
Verfasst: Sonntag 20. Mai 2018, 19:33
von Sirius3
Einrückung ist in Python wichtig. ›while‹ ist ohne syntaktischem Sinn eingerückt. Daneben ist es unsinnig `i` erst den Wert `int` dann 0 zuzuweisen. `sort` sollte man auch aufrufen (). Wenn man im vorhinein weiß, wie oft eine Schleife durchlaufen werden soll, dann nimmt man `for` und nicht `while`..
Re: Frage: random ohne Doppelung?
Verfasst: Sonntag 20. Mai 2018, 19:49
von ThomasL
Hi,
mit i = int weist du i den Wert von int zu, der undefiniert ist, int ist keine Typdefinition, sondern in diesem Fall eine Variable ohne Wert.
Der Inhalt einer Schleife muss eingerückt werden, so wie hier:
Code: Alles auswählen
i = 0
while i < 10:
zahlen = random.sample(range(1, 100, 5))
i += 1
Problem ist, dass hier der Variable "zahlen" 10x ein Zufallswert zugewiesen wird, der alte dabei jedoch immer überschrieben wird.
Wenn du eine Variable mit mehreren Werten haben möchtest, kannst du dies mit einer Liste oder einem Tuple realisieren.
Eine for-Schleife ist bei einer festen Anzahl von Wiederholungen auch eleganter, z.B.
Code: Alles auswählen
zahlen = []
for i in range(10):
zahlen.append(random.sample(range(1, 100, 5))
print(zahlen)
In Python gibt es zudem noch elegantere Lösungen dafür, sogenannte "list-comprehensions":
Code: Alles auswählen
zahlen = [random.sample(range(1, 100, 5) for i in range(10)]
print(zahlen)
Schau dir mal die Tutorials hier auf Youtube an. Kann ich empfehlen.
https://www.youtube.com/watch?v=dyJdLal ... 4oBgp3E9Zs
Re: Frage: random ohne Doppelung?
Verfasst: Sonntag 20. Mai 2018, 20:02
von pythonbeginner2000
Wow, super vielen Dank für eure Hilfe.
Ich lerne immer mehr dazu und danke für eure Geduld.
Leider funktioniert aber nicht die angebotene Version in PyCharm nicht:
zahlen = []
for i in range(10):
zahlen.append(random.sample(range(1, 100, 5))
print(zahlen)
Die Fehlermeldung in PyCharm Community IDE besagt:
print(zahlen)
^
SyntaxError: invalid syntax
Was kann da falsch sein?
Re: Frage: random ohne Doppelung?
Verfasst: Sonntag 20. Mai 2018, 20:14
von narpfel
@pythonbeginner2000: Zähl’ mal die Klammern in der Zeile vor dem Syntax-Error. Bitte setze außerdem Quelltext in Zukunft in Python- bzw. Code-Tags, damit die Einrückung erhalten bleibt und man den Quelltext lesen kann.
@ThomasL: `i = int` erstellt keine Variable mit undefiniertem Wert, sondern weist der Variablen `i` den Wert `int` zu (bzw. genauer: Der Wert `int` wird an den Namen `i` gebunden). In Python ist
alles, was man an einen Namen binden kann, ein Wert. Folgendes Programm gibt 42 aus, wenn 40 eingegeben wird:
Vielleicht ein etwas sinnvolleres Beispiel, warum man das machen will:
Code: Alles auswählen
def checked_input(prompt, type_=int):
while True:
try:
return type_(input(prompt))
except ValueError:
print(f"Please enter a value that can be converted to `{type_.__qualname__}`")
Re: Frage: random ohne Doppelung?
Verfasst: Sonntag 20. Mai 2018, 20:22
von ThomasL
narpfel hat geschrieben: Sonntag 20. Mai 2018, 20:14
@ThomasL: `i = int` erstellt keine Variable mit undefiniertem Wert, sondern weist der Variablen `i` den Wert `int` zu (bzw. genauer: Der Wert `int` wird an den Namen `i` gebunden).
uh wie peinlich, hast natürlich recht.
Und da int eine Klasse in Python ist, ist i nach i = int vom Typ <class 'int'>.

Re: Frage: random ohne Doppelung?
Verfasst: Sonntag 20. Mai 2018, 20:26
von narpfel
@ThomasL: Nicht ganz. Ganzzahlen sind vom Typ `int`, `int` ist von Typ `type`.

Re: Frage: random ohne Doppelung?
Verfasst: Montag 21. Mai 2018, 08:13
von ThomasL
Au man, die Erkenntnis des Unwissens ist wie im Treibsand feststecken und beim Versuch heraus zu kommen immer tiefer zu sinken.
Aber danke, habe dadurch wieder dazu gelernt.
Muss mich doch noch etwas tiefer mit dieser Materie beschäftigen
Code: Alles auswählen
>>> print(int)
<class 'int'>
>>> dir(int)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> print(int.__doc__)
int(x=0) -> integer
int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments
are given. If x is a number, return x.__int__(). For floating point
numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string,
bytes, or bytearray instance representing an integer literal in the
given base. The literal can be preceded by '+' or '-' and be surrounded
by whitespace. The base defaults to 10. Valid bases are 0 and 2-36.
Base 0 means to interpret the base from the string as an integer literal.
>>> int('0b100', base=0)
4
>>> type(int)
<class 'type'>