Würfel in python?


30.11.2021, 20:41

Die Nummer soll wirklich random sein, sodass man sie nicht irgendwie errechnen kann

BadIdol  30.11.2021, 20:34

Spezifikation?

YconKid 
Fragesteller
 30.11.2021, 20:35

Also eigentlich nur einen würfel. Nichts grafisches

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

YconKid 
Fragesteller
 30.11.2021, 21:22

Ich habe mir mal etwas code zusammengeschustert... 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)

0
reddox86  30.11.2021, 21:35
@YconKid

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ß ;-)

1
YconKid 
Fragesteller
 30.11.2021, 21:36
@reddox86

Ich weiß und man könnte natürlich alle daten abfangen aber ich mache es auch nur des spaßes halber

0
L4ze3  30.11.2021, 21:55
@reddox86

Außerdem könnte das Ergebnis abgefangen werden.

0
YconKid 
Fragesteller
 30.11.2021, 23:02
@L4ze3

sagte ich bereits aber danke

0
import random

def wuerfeln():
    return random.randint(1, 6)

Ganz einfach.

Oder als Inline-Function:

import random

wuerfeln = lambda: random.randint(1, 6)
YconKid 
Fragesteller
 30.11.2021, 20:37

Und dann ist es vollkommen random?

0
YconKid 
Fragesteller
 30.11.2021, 20:41
@BadIdol

Und wie kann ich wirklich random nummern generieren?

0
YconKid 
Fragesteller
 30.11.2021, 21:11
@TimeTravel3

Achso und wie wäre es mit einer api die diese Informationen über einen Quantencomputer abfragt möglich?

0
YconKid 
Fragesteller
 30.11.2021, 21:25
@TimeTravel3

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)

0
BadIdol  30.11.2021, 21:38
@YconKid

Ganz bestimmt nicht. Du kannst nicht mal eine grundlegende Funktion eines alltäglichen Modules und willst diesen Code als deinen verkaufen?

0
BadIdol  30.11.2021, 21:40
@YconKid

Erzähl doch nix! Lügen ist scheiße und vorallem Leute anlügen die dir geholfen haben.

1
CODENOTFOUND  30.11.2021, 22:33
@YconKid

Hahah wen lügst du eigentlich an?? Du weißt nichtmal was ein integer ist

0
YconKid 
Fragesteller
 30.11.2021, 22:35
@CODENOTFOUND

Ernst gemeinte Frage: Kannst du die Website von Bad öffnen?

0
YconKid 
Fragesteller
 30.11.2021, 22:41
@CODENOTFOUND

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

0
CODENOTFOUND  30.11.2021, 22:47
@YconKid

Das hast du aber schön im Internet gegoogelt, du hast nur gar keine Ahnung was ein buffer overflow ist ^^ 0×41

^^

0
YconKid 
Fragesteller
 30.11.2021, 22:51
@CODENOTFOUND

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

0
CODENOTFOUND  30.11.2021, 22:59
@YconKid

Dann hast du komplett falsch angefangen, solche leeren Fakten auswendig zu lernen bringen dir recht wenig

0
YconKid 
Fragesteller
 30.11.2021, 23:01
@CODENOTFOUND

Du hast recht... nicht das schlauste am anfang meiner Programmierer karriere

0
CODENOTFOUND  30.11.2021, 23:10
@YconKid

print("ich gehe schlafen")

Das ist das allererste was man lernt und du hast dabeibschon scheiße fabriziert

0
YconKid 
Fragesteller
 01.12.2021, 20:01
@CODENOTFOUND

Außerdem ist der code so schlecht geschrieben.... das kann doch nur ein beginner so wie ich gewesen sein

0

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.

YconKid 
Fragesteller
 30.11.2021, 21:22

Ich denke schon dass es möglich ist

0