Würfel in python?
Ich würde gerne einen eine Art echten Würfel mit python nachahmen. Wie geht das?
Die Nummer soll wirklich random sein, sodass man sie nicht irgendwie errechnen kann
3 Antworten
In einem PC läuft alles immer sehr geordnet, ein echter Zufall ist nicht möglich, es ist eher eine Simulation. Vereinfacht dargestellt: Du hast einen Seed (Anfangswert) und der wird immer nach einem Algorithmus durchgemischt - wenn dieser Seed aber bekannt ist, lassen sich die Zufallswerte errechnen.
Das ist vor allem in der Kryptographie ein Problem, da es Angriffvektoren schafft, deswegen lohnt es sich mal nach Zufall+Kryptographie zu googlen.
Ein genereller Ansatz ist es, diesen Algorithmus mit Entropie anzureichern. Diese wird aus externen Quellen erzeugt, z.B. Mausbewegungen, Tastatureingaben, Temperaturen und sonstigen, was sich algorithmisch nicht vorhersehen lässt. Mit dem Wissen über dieses Vorgehen ist der Zufall trotzdem angreifbar (aber ungleich schwerer).
In der Quantenmechanik sollte es meines Wissens möglich sein echten Zufall zu erreichen - aber abgesehen davon, dass du wahrscheinlich keinen Quantenrechner im Wohnzimmer stehen hast, ist mein Wissen bei der Thematik eher auf Halb-Wissen beschränkt.
Funktioniert einwandfrei. Aus kryptographischer Sicht würde ich Web-APis aber nicht als sichere Quellen betrachten - man kann das Ergebnis nicht vorraussehen, aber man kann es modifizieren. Zudem ist der Lag schon ziemlich hoch mit 0.5 bis 1 Sekunde pro Roll. Ein Kniffelwurf dauert dann so 3sec - erhöht die Spannung aber nicht den Spaß ;-)
import random
def wuerfeln():
return random.randint(1, 6)
Ganz einfach.
Oder als Inline-Function:
import random
wuerfeln = lambda: random.randint(1, 6)
Achso und wie wäre es mit einer api die diese Informationen über einen Quantencomputer abfragt möglich?
Ich habe kurz was kleines geschrieben was meinst du?
import requests as req
class dice:
def __init__(self):
self.base_url = 'https://www.random.org/'
class Service_Unavailable(Exception):
pass
def roll(self):
self._check()
randint = self._get_rnum()
return randint
def _check(self):
if int(req.get(f'{self.base_url}quota?format=plain').text) < 1:
raise self.Service_Unavailable
return 0
def _get_rnum(self):
treq = f'{self.base_url}integers/?num=1&min=1&max=6&col=1&base=10&format=plain&rnd=new'
sreq = req.get(treq).text
return sreq
mydice = dice()
num = mydice.roll()
print(num)
den code hast nicht du geschrieben, er stammt von: https://www.ictdemy.com/python/oop/rollingdie-in-python-constructors-and-random-numbers. und der ist auch nicht 100% random.
Hahah wen lügst du eigentlich an?? Du weißt nichtmal was ein integer ist
Ernst gemeinte Frage: Kannst du die Website von Bad öffnen?
Kp was das heißen soll. Ich bringe damit nur buffer overflows in verbindung aber was das im bezug auf die website heißt kp..
Das hast du aber schön im Internet gegoogelt, du hast nur gar keine Ahnung was ein buffer overflow ist ^^ 0×41
^^
Dougles Adams nutzt die 0x42 auch wenn die 0x41 bekannter ist :D
Edit:
Laut dem Hexa Dezimal system steht die 41 für A und 42 für B. Ganz vergessen zu erwähnen
Dann hast du komplett falsch angefangen, solche leeren Fakten auswendig zu lernen bringen dir recht wenig
Du hast recht... nicht das schlauste am anfang meiner Programmierer karriere
print("ich gehe schlafen")
Das ist das allererste was man lernt und du hast dabeibschon scheiße fabriziert
Außerdem ist der code so schlecht geschrieben.... das kann doch nur ein beginner so wie ich gewesen sein
Wie schon erwähnt wurde kann man random verwenden, was jedoch nicht die beste Möglichkeit ist.
secrets ist deutlich besser und auch kryptographisch sicherer als random.
import secrets
def roll_dice():
dice = [1,2,3,4,5,6]
return secrets.choice(dice)
100% Zufall zu generieren ist kaum bis gar nicht möglich.
Jap, jedoch ist secrets einer der einfachsten Varianten für kryptographisch sicherer Zufall, aber immer noch Pseudozufall und kein richtiger.
Hier sind paar Videos die gut erklären wie man richtigen Zufall in Python coded welcher auf Quantenphysikalischen Phänomen basiert
Ich habe mir mal etwas code zusammengeschustert... Was meinst du?