Seite 2 von 3

Verfasst: 29.05.2008 18:21
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....

Verfasst: 29.05.2008 18:36
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

Verfasst: 29.05.2008 18:50
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 

Verfasst: 29.05.2008 22:10
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

Verfasst: 29.05.2008 23:09
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.

Verfasst: 29.05.2008 23:40
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...

Verfasst: 29.05.2008 23:49
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...

Verfasst: 25.06.2008 13:23
von Little John
xxx

Verfasst: 25.06.2008 17:45
von AND51
Sehr schöne Erklärung, Hut ab! Bild
Beeindruckend!

Verfasst: 25.06.2008 18:34
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