Frage: random ohne Doppelung?

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
pythonbeginner2000
User
Beiträge: 4
Registriert: Samstag 19. Mai 2018, 20:45

Samstag 19. Mai 2018, 21:18

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)
Sirius3
User
Beiträge: 8424
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 19. Mai 2018, 21:31

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‹:

Code: Alles auswählen

zahlen = random.sample(range(1,7), 6)
pythonbeginner2000
User
Beiträge: 4
Registriert: Samstag 19. Mai 2018, 20:45

Sonntag 20. Mai 2018, 16:10

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.
Sirius3
User
Beiträge: 8424
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 20. Mai 2018, 16:32

Verwende Listen und Schleifen.
pythonbeginner2000
User
Beiträge: 4
Registriert: Samstag 19. Mai 2018, 20:45

Sonntag 20. Mai 2018, 19:23

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
Sirius3
User
Beiträge: 8424
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 20. Mai 2018, 19:33

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`..
Benutzeravatar
ThomasL
User
Beiträge: 301
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Sonntag 20. Mai 2018, 19:49

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
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
pythonbeginner2000
User
Beiträge: 4
Registriert: Samstag 19. Mai 2018, 20:45

Sonntag 20. Mai 2018, 20:02

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?
narpfel
User
Beiträge: 229
Registriert: Freitag 20. Oktober 2017, 16:10

Sonntag 20. Mai 2018, 20:14

@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:

Code: Alles auswählen

i = int
foo = i(input())
print(foo + 2)
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__}`")
Benutzeravatar
ThomasL
User
Beiträge: 301
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Sonntag 20. Mai 2018, 20:22

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'>. :-)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
narpfel
User
Beiträge: 229
Registriert: Freitag 20. Oktober 2017, 16:10

Sonntag 20. Mai 2018, 20:26

@ThomasL: Nicht ganz. Ganzzahlen sind vom Typ `int`, `int` ist von Typ `type`. 😉
Benutzeravatar
ThomasL
User
Beiträge: 301
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Montag 21. Mai 2018, 08:13

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'>

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
Antworten