RandomQ() - geht doch, sieht aber schlimm aus.

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> ... 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

:lol: :lol: :lol:

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
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Jetzt aber! Ich hatte einen Fehler im Code :oops: (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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

/:->

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 
Hier wird nach dem eintreffen einer Bedingung , zwei Äste geöffte die aber unterschiedlich viele verzweigungen haben, sodass die Wahrscheinlichkeiten ins ungleichgewicht kommen.

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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

am besten wäre es wohl, eine richtige Random() routine zu schreiben, die mit Quads arbeitet,
anstatt etwas auf die vorhandene Long-Random aufzusetzen...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Ja das hab ich mir auch gerade gedacht... doch man bräuchte min 68 Bit Werte um auf eine Zufallszahl mit 64Bit zu kommen...
Little John

Beitrag von Little John »

xxx
Zuletzt geändert von Little John am 07.05.2010 01:21, insgesamt 3-mal geändert.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Sehr schöne Erklärung, Hut ab! Bild
Beeindruckend!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Da dieser Thread wieder aktiviert wurde (sehr schön LJ :allright: ), möchte ich mal zart anmerken, daß sich AES ganz vorzüglich zur Erzeugung von Zufallszahlen gewünschter Länge eignet. "Zufallszahlen" natürlich im bekannten Rahmen.

Gruß
Helle
Antworten