![]() |
Re: Zufals-Boolean erzeugen
@Olli:Ob ich nun
Delphi-Quellcode:
nehme, oder
bRand := Boolean (Random (2))
Delphi-Quellcode:
ist, zumindest beim Delphi-Randomgenerator, auch mathematisch ein und die selbe Sosse.
bRand := Boolean (Random (10000) mod 5000)
@BenjaminH: Stimmt, aber ist das Zufall? Nein! Denn Du hast vorher bestimmt, wie das Ergebnis sein soll: Wenn Du Dir die ersten 999 Ergebnisse anschaust, weist Du 100%ig, wie das 1000ste aussieht. Da kann man dann von Zufall nun wahrlich nicht mehr sprechen. Du wirst also mit deinem Verfahren keine 1000 Zufallsbooleans erzeugen, sondern maximal 999. Im Regelfall sogar weniger. Bei Zufallszahlen kann man eben nicht vorhersagen, wie oft welche Zahl kommt. Man weiss nur, das 'am Ende des Tages', also in der Tendenz, die Wahrscheinlichtkeit am höchsten ist, das die Zahlen gleichverteilt sind. Ob nun 'zufällig' die 10000000 Zahlen 1 sind, weiss man nicht, aber es könnte sein und wäre natürlich legitim. Hört auf, Euch den Zufall so hinzubiegen, wie ihr ihn gerne hättet. Nehmt dann lieber Permutationen. |
Re: Zufals-Boolean erzeugen
Zitat:
Die Wahrscheinlichkeit, dass beim ersten Wurf TRUE rauskommt, beträgt 1:2 Die Wahrscheinlichkeit, dass beim zweiten Wurf UND beim ersten TRUE rauskommt, beträgt 1:(1:2), also 1:4=1:2^2 10 mal hintereinander TRUE zu erhalten hat also eine Wahrscheinlichkeit von 1:2^10, also 1:1024 Die Wahrscheinlichkeit hingegen, 5 mal TRUE und 5 mal FALSE rauszubekommen beträgt 1:2. Noch ne andere Anmerkung... Das Erstellen eines Arrays, anschliessendes Mischen, und wieder Ausspucken der Werte hat nun aber mal rein gar nichts mehr mit Wahrscheinlichkeit zu tun, da damit garantiert wird, dass 5 mal true und 5 mal FALSE bei rauskommt. Das Problem ist also damit bestimmt, und hat nichts mehr mit random zu tun. |
Re: Zufals-Boolean erzeugen
Zitat:
;-) Also mit "genauso" meinte ich auf keinen Fall "genauso oft". Ich wollte damit nur darauf hinweisen, dass es durchaus möglich ist. Greetz Sergej |
Re: Zufals-Boolean erzeugen
Zitat:
|
Re: Zufals-Boolean erzeugen
[Ein wenig OT]
@Jelly: Es ist doch von der Wahrscheinlichkeit her völlig egal welchen der folgenden Fälle ich habe: 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 . . . Die W. liegt bei jedem 'Wurf' bei 0.5, sowohl für 1 also auch für 0. Das bedeutet aber wiederum, dass die W. für einen bestimmtenes Ergebnis bei (1/2)^n liegt...oder? Lasse mich gerne belehren :) [Edit] Formulierung verdeutlicht Greetz Sergej |
Re: Zufals-Boolean erzeugen
Zitat:
Zitat:
Code:
In dieser Liste spielen 2 Kombinationen eine gesonderte Rolle und entsprechen deiner Vorstellung von (1/2)^n. Nämlich 0000 und 1111. Für beide gilt eine Wahrscheinlichkeit von 1:16=1:2^4 diese Kombination zu erhalten.
0000
0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Die Wahrscheinlichkeit jedoch 2 mal 0 und 2 mal1 zu erhalten, ist dabei grösser, da es ja egal ist ob du 0011, 1100, 0101, 1010 usw. hast, um 2 mal 0 und 2 mal 1 zu erhalten... Zähle aus der obigen Liste alle Kombinationen von 2 mal 0 und 2 mal 1, so sind das diese:
Code:
Die Gesamtwahrscheinlichkeit 2 mal 0 und 2 mal 1 zu erhalten beträgt demnach 6:16=3:8, also 37,5%
0011
0101 0110 1001 1010 1100 Das kann man aber auch ausrechnen. Googeln nach ![]() |
Re: Zufals-Boolean erzeugen
Ahhh...ich erkenne meinen Denkfehler :shock: Die Reihenfolge wird ja nicht berücksichtigt...Danke für die Erklärung :)
Greetz Sergej |
Re: Zufals-Boolean erzeugen
Ähm, Leute... jetzt mal ganz pragmatisch, ohne Ausschweife in Theorien über Zufall etc. (Auch wenn ich das ebenso interessant finde):
Die Variante mit einem zu gleichen Teilen gefüllten gemischten Array scheint mir doch sehr nach dem auszusehen, was der Fragesteller haben will!? Da hilft auch langes Lamentieren nix :P. Und um an der Fachsimpelei anzuknüpfen: Auch bei dieser Variante ist sehr wohl Zufall enthalten. Nicht was das Verhältnis der Vorkommen der Werte angeht, aber durchaus (ja nach verwendetem Mischalgo) in der Reihenfolge der Vorkommen. Ob nun das letzte Vorkommen mit Kenntniss aller vorigen determiniert ist, ist doch völlig unerheblich. Mit geeigneter Mischmethode ist das letzte Vorkommen genauso mit einer Wahrscheinlichkeit von 1:2 true (bzw. false) wie es an jeder anderen Stelle auch wäre (wenn das Array 1:1 true:false gefüllt ist). Ich glaube nicht dass der Fragesteller ausdiskutieren wollte ob er nun (pseudo-)echten Zufall haben möchte / brauchen kann, sondern ganz einfach eine Lösung zu seinem Problem sucht. Diese wäre ein solches Array denke ich ;) Eine RandomBool-Funktion gibt es in Delphi nicht, allerdings stehen im Thread verteilt nun mehrere Wege das zu erreichen. Und wenn es nun unbedingt als Funktion sein soll... verpack es in eine :zwinker:. Die Bedingung nach N Ziehungen aber je N/2 true und false zu erhalten garantiert diese Herangehensweise jedoch nicht. Dazu wäre es eben im Vorfeld nötig zu wissen wie viele Ziehungen letztlich gemacht werden sollen, und sich der Möglichkeit des Arrays zu bedienen. Ohne Kenntnis über die Gesamtzahl der Ziehungen ließe sich das nur noch näherungsweise erzwingen, in dem man jedes Mal mitprotokolliert in welchem Verhältnis true/false aufgetreten sind, und die nächste Ziehung mit einer entprechend gegengerichteten Wahrscheinlichkeit durchzuführen. (Wie dies gemacht werden kann steht auch schon im Thread.) Bei dieser Variante ist es ebenfalls nicht garantiert ein 1:1 herauszubekommen, allerdings ließe sich so erreichen dass der "Zufall" schon früher als nach 1000 Ziehungen eine Ausgewogenheit erreicht. Wenn man die Wahrscheinlichkeit extrem setzt, so erhält man jedoch irgendwann ein alternierendes System bei dem lediglich true/false/true/false/... erzeugt wird -> also voll deterministisch. D.h. mit dieser Variante lässt sich der (Pseudo-)Zufall quasi stufenlos in eine deterministische Folge wandeln, die zwar frühe Ausgewogenheit immer wahrscheinlicher macht, aber eben den "Zufall" unwahrscheinlicher :stupid: Und nu geh ich schlafen :) Gruss, Fabian |
Re: Zufals-Boolean erzeugen
Ihr könnte ja bei dem gefüllten Array bleiben, auch wenn der 1000ste Wert nchtvorhersehbar sein soll.
Man nehme einfach euer Array mit den 1000 Werten und fülle es per "Zufall" sagen wir mal mit 450 bis 550 True's (den Rest natürlich dann mit False). Und danach wird das Array dann ebenfalls durchgemischt. Da jetzt aber keine 500 mal True und False im Array vorhanden sind, sonder eine "zufällige" Anzahl derer, ist der 1000ste Wert nicht mehr "vorhersehbar". Und da sich die Anzahl der "zufälligen" True's ebenfalls um die 500 bewegt, ergibt das auf dir 1000 gerechner fast eine gleichmäßige Verteilung. |
Re: Zufals-Boolean erzeugen
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz