Random selbstgestrickt: Alles Zufall?

Die in ST-Computer Heft 10/86 unter Ausnützung der XBIOS 17 Routine vorgestellte Randomfunktion bietet zwar die Möglichkeit Zufallszahlen zu erzeugen, dies jedoch nicht in einem abgrenzbaren Bereich (z. B. von 0 bis 20). Die Demoprogramme von ST-Pascal+ z. B. „DCOS“ zeigen zwar einen Weg mit random &20, jedoch mußte ich leider feststellen, daß diese alles andere als sehr „zufällig“ waren.

Dies wird im ersten Testprogramm deutlich. In dem Programm werden 200 Zufallszahlen erzeugt, wie in „DCOS“ vorgeschlagen. Der Bereich soll hier auf 20 beschränkt sein. Die erzeugte Zahl spricht über die Variable i ein Feld an und der Wert dieses Feldes wird um 1 erhöht. Es wird also angezeigt, wie oft eine Zufallszahl den Wert von i hatte. Das Ergebnis ist nicht sehr erfreulich. Die meisten Zahlen tauchen überhaupt nicht auf.

Nur 0,4,16 und 20 werden öfters gezogen.

Nach diesem wenig brauchbaren Ergebnis, mußte ich mir überlegen, wie ich dennoch zu meinen Zufallszahlen kommen konnte. Dazu schaute ich mir noch einmal die gelieferten Zahlen an. Der weitaus überwiegende Teil liegt im 6-7stelligen Bereich.

Seltener sind schon fünfstellige, vierstellige Zahlen sind schon äußerst selten zu nennen. Dies führte mich zu folgenden Überlegungen: Da der überwiegende Teil der Zahlen 6 oder 7 stellig ist, brauche ich eine Zahl aus diesem Bereich, die mir bei Division mit der Zufallszahl einen Wert von Null bis Eins liefert. Diese dann mit der Zufallsgrenzzahl multipliziert, ergibt dann die gewünschten Zufallszahlen. Die in der Funktion Random benutzte Zahl habe ich empirisch herausgearbeitet. Mit dieser Zahl erreicht man eine gute Verteilung der Zufallszahlen. Manchmal kann es Vorkommen, daß eine Zahl ausgeben wird die um eins größer ist als der Zufallsbereich. Die wurde jedoch in der Funktion Random berücksichtigt. Die erzielten Ergebnisse lassen sich am zweiten Programm deutlich ablesen. Auch hier wird, wie im obigen Programm, der Wert der Zufallszahl dazu benützt den Inhalt des entsprechenden Feldes um Eins zu erhöhen. Gegenüber dem ersten Programm ist deutlich die bessere Verteilung der Werte zu erkennen. Dazu ist die Verteilung ziemlich ausgewogen. Für denjenigen, der die Programme nicht abtippen will, habe ich zwei Tabellen gemacht, in denen er die Ergebnisse der beiden Programme erkennt.

Die Randomfunktion arbeitet bis zum Bereich von 32768 (Integer-Höchstzahl). Wer diese häufig benützt sollte sie in die Library GEMSUBS. PAS einfügen. Dann steht sie sofort bei Aufruf zur Verfügung.

program test;

var i:integer; 
	a:integer;
	feld:array[0..20] of integer: 

function random: integer; xbios(17);

begin
	for a:=0 to 20 do feld[a]:=0; 
	for a:=1 to 200 do begin 
		i:=random & 20; 
		feld[i]:=feld[i]+1 
	end;
	for a:=0 to 20 do writeln (feld[a]); 
	readln 
end.

LISTING 1: Zufallszahlen mit der normalen Random-Funktion.

program test;

var i:integer; 
	a:integer;
	feld:array[0..20] of integer: 

function random(x:integer):integer;

var ran:real;
	hilf:integer:

function rnd:long_integer:xbios(17):

begin 
	ran:=rnd/15645200; 
	hilf:=trunc(ran*x); 
	if hilf>x then hilf:=x; 
	random:=hilf 
end;

begin
	for a:=0 to 20 do feld[a]:=0; 
	for a:=1 to 200 do begin 
		i:=random (20); 
		feld[i]:=feld[i]+1 
	end;
	for a:=0 to 20 do writeln (feld[a]); 
	readln 
end.

LISTING 2: Zufallszahlen mit der eigenen Routine.

Zufallszahlenergebnis bei Programm Nr.1 
0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10|11|12|13|14|15|16|17|18|19|20| 
---------------------------------------------------------------
57|0 |0 |0 |49|0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |0 |44|0 |0 |0 |50|

Zufallszahlenergebnis bei Programm Nr.2 
0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10|11|12|13|14|15|16|17|18|19|20| 
---------------------------------------------------------------
10|10|9 |6 |14|12|11|10|4 |12|4 |13|14|12|9 |6 |11|7 |7 |7 |12|

Rainer Esser
Aus: ST-Computer 12 / 1987, Seite 84

Links

Copyright-Bestimmungen: siehe Über diese Seite