RandomQ() - geht doch, sieht aber schlimm aus.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> ... bei "kleineren" Quad-Zahlen wird da sicher einiges an Rechenleistung verbraten.
ja is klar... trotzdem isses die einfachste lösung.
das problem war nicht die gleichverteilung der bits....
wenn ich eine zufallszahl 0 - $FFFFFFFF erzeugen soll,
und setze die aus (R($FFFF)<<16)+(R($FF) <<8)+R($FF) zusammen,
ist die gleichverteilung durchaus gewährleistet.
das problem waren "unvolle" wertegrenzen.
...jedenfalls hatte SG so argumentiert, ich bin mir da grad garnicht mehr so sicher, ob das wirklich zutrifft....
ja is klar... trotzdem isses die einfachste lösung.
das problem war nicht die gleichverteilung der bits....
wenn ich eine zufallszahl 0 - $FFFFFFFF erzeugen soll,
und setze die aus (R($FFFF)<<16)+(R($FF) <<8)+R($FF) zusammen,
ist die gleichverteilung durchaus gewährleistet.
das problem waren "unvolle" wertegrenzen.
...jedenfalls hatte SG so argumentiert, ich bin mir da grad garnicht mehr so sicher, ob das wirklich zutrifft....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Ich weis zwar nicht wie schnell das jetzt ist, aber das sollte gehen:
Code: Alles auswählen
Procedure.q RandomQ(quad.q)
result.q
factor.q = 1
low.b
Dim numArray(18)
Repeat
numArray(count) = quad % 10
quad / 10
count + 1
factor * 10
Until quad = 0
count - 1
factor / 10
For i = count To 0 Step -1
If low = 1
random = Random(9)
Else
random = Random(numArray(count))
EndIf
If random <> numArray(count)
low = 1
EndIf
result + random * factor
factor / 10
Next
ProcedureReturn result
EndProcedure



Findest du das das hier n gleichberechtigung ist ?
Bei Random(19) kommen 10 und 11 jeweils 5 mal mehr als alle andere, und 12-19 garnicht -.-
so jetzt setzte ich mich auch an n Procedure !
Code: Alles auswählen
Procedure.q RandomQ(quad.q)
result.q
factor.q = 1
low.b
Dim numArray(18)
Repeat
numArray(count) = quad % 10
quad / 10
count + 1
factor * 10
Until quad = 0
count - 1
factor / 10
For i = count To 0 Step -1
If low = 1
random = Random(9)
Else
random = Random(numArray(count))
EndIf
If random <> numArray(count)
low = 1
EndIf
result + random * factor
factor / 10
Next
ProcedureReturn result
EndProcedure
Menge = 19
Dim Zahlen(Menge)
For n = 1 To 100000
Zahl = RandomQ(Menge)
Zahlen(Zahl) + 1
Next
Debug "Verteilung der Zahlen"
For n = 0 To Menge
Debug "Zahl "+Str(n)+" : "+Str(Zahlen(n))
Next
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Jetzt aber! Ich hatte einen Fehler im Code
(dieser dumme index -.-)

Code: Alles auswählen
Procedure.q RandomQ(quad.q)
result.q
factor.q = 1
low.b
Dim numArray(18)
Repeat
numArray(count) = quad % 10
quad / 10
count + 1
factor * 10
Until quad = 0
count - 1
factor / 10
For i = count To 0 Step -1
If low = 1
random = Random(9)
Else
random = Random(numArray(i))
EndIf
If random <> numArray(i)
low = 1
EndIf
result + random * factor
factor / 10
Next
ProcedureReturn result
EndProcedure
menge.q = 19
zahl.q
Dim Zahlen(menge)
For n = 0 To 1000000
zahl = RandomQ(menge)
Zahlen(zahl) + 1
Next
Debug "Verteilung der Zahlen"
For n = 0 To menge
Debug "Zahl " + Str(n) + " : " + Str(Zahlen(n))
Next

gib mal an menge = 12 ein...
...
Ich versuche jetzt mal ein bisschen Wahrscheinlichkeitsrechnung:
Gegeben ist ein einstufiges Experiment, bei dem eine Zahl von 12 möglichen gezogen werden muss:
Tisch:( 1 2 3 4 5 6 7 8 9 10 11 12 )
Man erhält einen Wahrscheinlichkeitsbaum mit 12 Ästen, die alle eine Wahrscheinlichkeit haben von 1/12 = 8,333%
OK
Gegeben ist ein zweistufiges Experiment, bei dem ein Beutel Zahl von 3 möglichen gezogen werden, in welchen sich 4 Zahl befinden, von denen wiederum eine gezogen wird:
Tisch:( Beutel_1( 1 2 3 4) Beutel_1( 5 6 7 8 ) Beutel_1( 9 10 11 12) )
Man erhält einen Wahrscheinlichkeitsbaum mit 3 HauptÄsten, die alle eine Wahrscheinlichkeit haben von 1/3 = 33,333% haben, an denen wieder NebenÄste sind die jeweils eine Wahrscheinlichkeit von 1/4 = 25% haben.
Die Wahrscheinlichkeit jeder Zahl ergibt sich nun aus der Multiplikation der TeilWahrscheinlichkeiten:
1/3 * 1/4 = 1/12 = 8,333%
OK
Gegeben ist ein zweistufiges Experiment, bei dem ein Beutel Zahl von 2 möglichen gezogen werden, in welchen sich 10 Zahl befinden bzw. beim 2. nur 2, von denen wiederum eine gezogen wird:
Tisch:( Beutel_1( 1 2 3 4 5 6 7 8 9 10 ) Beutel_2( 11 12 ) )
Man erhält einen Wahrscheinlichkeitsbaum mit 2 HauptÄsten, die alle eine Wahrscheinlichkeit haben von 1/2 = 50% haben, an denen wieder NebenÄste sind die jeweils eine Wahrscheinlichkeit von 1/10 = 10% beim 1. Beutel haben und 1/2 = 50% beim 2. haben.
Die Wahrscheinlichkeit jeder Zahl ergibt sich nun aus der Multiplikation der TeilWahrscheinlichkeiten:
Zahlen 1-10 : 1/2 * 1/10 = 1/20 = 5%
Zahlen 11-12 : 1/2 * 1/2 = 1/4 = 25%
ERROR
Wie man sieht entstehen probleme wenn man versucht, eine Zufallszahl unter bestimmten bedingungen versucht zu erzeugen.
Dieser Ansatz ist verboten:
Code: Alles auswählen
If low = 1
random = Random(9)
Else
random = Random(numArray(i))
EndIf
Bitte nehm(t) es nicht böse, ich möchte nur das die Code die hier veröffendlich werden auch mathematisch OK sind, Programmiertechnisch mag das ja scheiß egal sein. aber nicht Mathematisch.
Ich hoffe mein kleiner exkurs hat euch weiter geholfen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Sehr schöne Erklärung, Hut ab!
Beeindruckend!

Beeindruckend!
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End