Forum: Mikrocontroller und Digitale Elektronik Bascom RND Befehl nicht wirklich Randome?


von Pascal B. (mini12345)


Lesenswert?

Also ich bin der Meinung das der RND befehl in Bascom nicht wirklich 
zufällig ist .

Hier mein Programm:
1
$regfile = "m8def.dat"
2
$crystal = 1000000
3
Config Pinb.1 = Output
4
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
5
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
6
  Config Lcd = 16 * 1
7
  Cursor Off
8
Config Portb.2 = Output
9
10
   Dim Zufall As Byte
11
   Dim Speed As Byte
12
   Dim I As Byte
13
   Dim Speed2 As Byte
14
  Portb.2 = 1
15
    Portc.5 = 1
16
17
Do
18
   If Pinb.1 = 1 Then
19
   Zufall = Rnd(10)
20
   Speed = 1
21
   Speed2 = 0.7
22
   If Zufall = 7 Then
23
   Cls
24
   Locate 1 , 2
25
   Lcd "1111"
26
   For I = 1 To 3
27
   Portb.2 = 0
28
   Wait Speed2
29
   Portb.2 = 1
30
   Wait Speed2
31
   Next
32
   Wait Speed
33
   Cls
34
   Elseif Zufall = 9 Then
35
   Cls
36
   Locate 1 , 1
37
   Lcd "2222"
38
   For I = 1 To 3
39
   Portb.2 = 0
40
   Wait Speed2
41
   Portb.2 = 1
42
   Wait Speed2
43
   Next
44
   Wait Speed
45
   Cls
46
   Elseif Zufall = 2 Then
47
   Cls
48
   Locate 1 , 1
49
   Lcd "3333"
50
   For I = 1 To 3
51
   Portb.2 = 0
52
   Wait Speed2
53
   Portb.2 = 1
54
   Wait Speed2
55
   Next
56
   Wait Speed
57
   Cls
58
   Elseif Zufall = 5 Then
59
   Cls
60
   Locate 1 , 2
61
   Lcd "44444"
62
   Locate 2 , 3
63
   Lcd ";-("
64
    For I = 1 To 3
65
   Portb.2 = 0
66
   Wait Speed2
67
   Portb.2 = 1
68
   Wait Speed2
69
   Next
70
    Wait Speed
71
   Cls
72
   Else
73
   Cls
74
   Locate 1 , 3
75
   Lcd "Fail"
76
   Locate 2 , 3
77
   Lcd ":-D"
78
79
    Wait Speed
80
   Cls
81
   End If
82
   End If
83
   Cls
84
85
86
Loop
87
End


Aber irgendwie kommt z.b. die 4444 viel öfter als andere .also wird die 
#Zahl 5 viel öfter gewürfelt.....

Nur warum?

Danke.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Hast du auch diesen Satz aus der BASCOM Doku
1
Notice that it is a software based generated number.
2
And each time you will restart your program the same sequence will be
3
created.
beachtet?

http://avrhelp.mcselec.com/index.html?rnd.htm

> Aber irgendwie kommt z.b. die 4444 viel öfter als andere .also wird die #Zahl 5 
viel öfter gewürfelt.....

So, so. Und auf wievielen 10-tausend Würfelungen in einer Session (damit 
obiger Satz nicht wirksam wird) stützt sich dein Befund?
Zufälligkeit ist eine statistische Eigenschaft einer Folge von Zahlen. 
UNd so wie bei allen Statistiken, benötigt man dazu eine ausreichend 
lange Zahlenfolge. Bei 100 Würfen mit einem Würfel ist es nicht 
ungewöhnlich, dass eine Augenzahl nur 9 mal vorkam, eine andere dagegen 
22 mal. 100 ist eine zu kleine Zahl von Würfen, damit sich der 
Erwarttungswert 16 ausbilden könnte. Man muss schon 10000 Würfe machen, 
damit man dann in den einzelnen Augenzahlen die erwarteten 
16-hundert+irgendwas sieht und du gewillt bist, das als 'im wesentlichen 
kommen alle 6 Zahlen gleich oft vor' zu akzeptieren.

Da ich mir aber nicht vorstellen kann, dass du enstprechend viele 
Versuche in einem Rutsch gemacht hast, auf der anderen Seite durch die 
Nichtbeachtung des Startwertes nach einem erneuten Programmstart immer 
die gleiche Folge von Zahlen kriegst, ist deine Aussage, der Generator 
wäre fehlerhaft, nicht viel wert.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Pascal B. schrieb:

>
> Nur warum?

Gegenfrage: Wo soll der echte Zufall hier herkommen?

Abgesehen davon, mit deiner Methode kannst du die Qualität der 
Zufallszahlen nicht beurteilen. Nur weil eine Zahl ein paar mal öfter 
vorkommt.

Eine Pseudo-Zufallsgenerator muss man auch initalisieren. Mit einer 
Zufallszahl wenn möglich. Was sagt die Doku dazu?

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

RND war schon zu C64-Zeiten nicht wirklich zufällig...

von Rauschrausch (Gast)


Lesenswert?

Thomas Glass schrieb:
> RND war schon zu C64-Zeiten nicht wirklich zufällig...

Von wegen! Da nahm man den Rauschgenerator des SID. Sozusagen ein echter 
Hardware Zufallszahlengenerator.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> Da ich mir aber nicht vorstellen kann, dass du enstprechend viele
> Versuche in einem Rutsch gemacht hast, auf der anderen Seite durch die
> Nichtbeachtung des Startwertes nach einem erneuten Programmstart immer
> die gleiche Folge von Zahlen kriegst, ist deine Aussage, der Generator
> wäre fehlerhaft, nicht viel wert.

Als Minimum könntest du zb hergehen und dir den ___RSEED so wie in der 
Doku beschrieben als eigene Variable anlegen, deren Wert du im EEPROM 
speichern kannst und die du beim Programmstart aus dem EEPROM wieder mit 
dem zuletzt gespeicherten Wert besetzt. Dann ist zumindest erst mal der 
Punkt vom Tisch, dass du jedesmal die gleiche Zahlenfolge kriegst, weil 
du bei jedem Programmstart mit einem anderen Wert für __RSEED startest.

von Pascal B. (mini12345)


Lesenswert?

also ich habe ca. 100 versuche gehabt, und wenn jedes mal z.b. die 7 
gewürfelt wird sagt mir es doch das da was nicht stimmt....

testet es doch selbst ....

den Satz in der Doku hab ich danach gelesen, aber es sollte doch so 
zufällig sein das es bei 10 versuche jedes mal, oder zumindest fast 
jedes mal ein anderes Ergebnis gibt oder?

meine Vorgehensweise ist :

Ich drücke den Taster und notiere mir das Ergebnis, das mach ich so 
lange bis ein Ergebnis 10 mal da war.

und da kommt fast immer das gleiche raus.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Rauschrausch schrieb:
> Thomas Glass schrieb:
>> RND war schon zu C64-Zeiten nicht wirklich zufällig...
>
> Von wegen! Da nahm man den Rauschgenerator des SID. Sozusagen ein echter
> Hardware Zufallszahlengenerator.

Hmmm....

hab da mal etliche hundert Pixel "zufällig" setzen lassen und muss sagen 
Zufall sieht i-wie anders aus. Die genauen Umstände weiss ich nach ca 30 
Jahren aber nicht mehr.

von Pascal B. (mini12345)


Lesenswert?

ach was mir gerade aufgefallen ist , wenn ich die Schaltung einschalte 
und drücke kommt 2 mal Fail und dann die 1111. Das kommt immer... ist 
das normal?

Hab ich evtl ein Fehler im Programm?

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Als Minimum könntest du zb hergehen und dir den ___RSEED so wie in der 
Doku beschrieben als eigene Variable anlegen, deren Wert du im EEPROM 
speichern kannst (naqch einem RND) und die du beim Programmstart aus dem 
EEPROM wieder mit dem zuletzt gespeicherten Wert besetzt. Dann ist 
zumindest erst mal der Punkt vom Tisch, dass du jedesmal die gleiche 
Zahlenfolge kriegst, weil du bei jedem Programmstart mit einem anderen 
Wert für __RSEED startest.

: Bearbeitet durch User
von Pascal B. (mini12345)


Lesenswert?

ich bin neu bei der Sache und hab deshalb nicht das nötige wissen was in 
den EEPROM zu speichern...
Könntet ihr mir da einen Progammbeispiel oder sowas zukommen lassen?

Mein Englisch ist miserabel deswegen hilft die Doku nur teilweise...

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Pascal B. schrieb:
> also ich habe ca. 100 versuche gehabt,

viel zu wenig um irgendetwas statistisch relevantes aussagen zu können.


> und da kommt fast immer das gleiche raus.

Dann fang erst mal an, dein Programm insofern korrekt zu machen, dass du 
den Generator korrekt benutzt. Die Warnung steht nicht ohne Grund in der 
Doku

von Stefan Noack (Gast)


Lesenswert?

Thomas Glass schrieb:
>> Von wegen! Da nahm man den Rauschgenerator des SID. Sozusagen ein echter
>> Hardware Zufallszahlengenerator.
>
> Hmmm....
>
> hab da mal etliche hundert Pixel "zufällig" setzen lassen und muss sagen
> Zufall sieht i-wie anders aus. Die genauen Umstände weiss ich nach ca 30
> Jahren aber nicht mehr.

Der Rauschgenerator im SID ist auch nur ein LFSR, allerdings schiebt er 
von selbst regelmäßig weiter. Bei zufälligem Timing, z.B. wenn man auf 
Benutzerinteraktion wartet, funktioniert das super, beim ausgeben von 
Pixeln im gleichmäßigen Takt sieht man jedoch die periode.

von Jetzt (Gast)


Lesenswert?

Was wirft den Gurgel aus ?

von Karl H. (kbuchegg)


Lesenswert?

Pascal B. schrieb:
> ich bin neu bei der Sache und hab deshalb nicht das nötige wissen was in
> den EEPROM zu speichern...

dann ... lerne es.

> Könntet ihr mir da einen Progammbeispiel oder sowas zukommen lassen?

Google ist dein Freund und BASCOM Tutorien gibt es auch frei verfügbar. 
Gerade in BASCOM ist das wirklich nicht schwer.

> Mein Englisch ist miserabel deswegen hilft die Doku nur teilweise...

macht nix. Das Englisch von älteren Japanern ist noch miserabler und die 
schaffen das auch. Technisches Englisch ist ja schliesslich keine 
Romansprache mit gefinkelten Satzkonstrukten.

von Uwe (Gast)


Lesenswert?

Oder man zählt mit irgendeinem Timer mit hoher frequenz wie lange ein 
Tastendruck dauert, daß ist dann jedesmal anders (z.B. beim AVR nen 8 
Bit Timer mit 16MHz Zählen lassen). Der ist garantiert ziemlich 
zufällig.

von Harald N. (haraldn)


Lesenswert?

Wenn du das wirklich überprüfen willst, lass dir sehr sehr viele Zahlen 
ausgeben zb über UART und mach ein Diagramm. Je mehr Zahlen 
(nacheinander nicht willkürlich ausgewählte) du untersuchst desto näher 
kommst du der Wahrheit.
Und - informier dich über Statistik und Wahrscheinlichkeit
Als Seed kannst du das Rauschen eines Eingangs verwenden.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> macht nix. Das Englisch von älteren Japanern ist noch miserabler und die
> schaffen das auch. Technisches Englisch ist ja schliesslich keine
> Romansprache mit gefinkelten Satzkonstrukten.

Ich sag das nicht, weil ich dich ärgern will. Aber es ist nun mal so, 
dass die Fachsprache in der Programmierung Englisch ist. Ohne wenigstens 
ein bischen Englisch kommst du nicht weit. Also leg deine Scheu ab, leg 
dir einen Link zu einem Online-Übersetzer in deinen Browser und fang 
genau JETZT damit an, die Doku im Original zu lesen, zu übersetzen und 
zu verstehen. Das ist am Anfang etwas gewöhnungsbedürftig, aber es 
kommen immer wieder die gleichen Worte und die gleichen Phrasen vor, so 
dass das alles nach kurzer Zeit recht flott von der Hand geht. Du musst 
ja nur Lesen und nicht Schreiben.

von Route_66 (Gast)


Lesenswert?

Pascal B. schrieb:
> Do
>    If Pinb.1 = 1 Then
>    Zufall = Rnd(10)

Hallo!
Das Einfachste ist, nicht nur einmal den RND() Wert zu ermitteln wie 
hier oben, sondern in einer Schleife mehrmals, solange der Knopf 
gedrückt ist. Erst wenn der Taster losgelassen wird, mit dem letzten 
Wert weitermachen. Niemand drückt immer gleich lang den Knopf.

von Karl H. (kbuchegg)


Lesenswert?

Nur mal als Beispiel.

Das hier ist die Statistik in einem einfachen Programm, welches 
6-seitige Würfel simuliert. Angegeben ist die Anzahl der Augenzahlen bei 
x Versuchen.
1
Anzahl Wuerfe: 1
2
1:      0  2:      0  3:      0  4:      0  5:      0  6:      1
3
4
Anzahl Wuerfe: 10
5
1:      2  2:      0  3:      1  4:      0  5:      4  6:      3
6
7
Anzahl Wuerfe: 100
8
1:     16  2:     10  3:     18  4:     22  5:     16  6:     18
9
10
Anzahl Wuerfe: 1000
11
1:    155  2:    164  3:    182  4:    166  5:    166  6:    167
12
13
Anzahl Wuerfe: 10000
14
1:   1668  2:   1678  3:   1623  4:   1711  5:   1676  6:   1644
15
16
Anzahl Wuerfe: 100000
17
1:  16638  2:  16696  3:  16565  4:  16613  5:  16743  6:  16745

Man sieht:
bei 100 Würfen streut die Anzahl der jeweils gewürfelten Augenzahlen (in 
diesem Beispiel) von 10 bis 18 mal.

Bei 1000 ist immer noch kein annähernder Gleichstand zu verzeichnen. Die 
1 kam 155 mal vor, die 3 182 mal.
Erst bei 10000 wird die prozentuelle Differenz zwischen den Wurfzahlen 
geringer und erst bei den Zahlen von 100000 Würfen würde man als 
Unbedarfter das Attribut 'fair' benutzen.

1
#include <stdio.h>
2
#include <stdlib.h>
3
4
void heap( int nrTries )
5
{
6
  int i;
7
  int hits[6] = { 0, 0, 0, 0, 0, 0 };
8
  
9
  for( i = 0; i < nrTries; i++ )
10
    hits[rand()%6]++;
11
    
12
  printf( "Anzahl Wuerfe: %d\n", nrTries );
13
  for( i = 0; i < 6; i++ )
14
    printf( "%d: %6d  ", i+1, hits[i] );
15
  printf( "\n\n" );
16
}
17
18
int main()
19
{
20
  int nr = 1;
21
22
  while( nr < 1000000 ) {
23
    heap( nr );
24
    nr = nr * 10;
25
  }
26
}

: Bearbeitet durch User
von Harald N. (haraldn)


Lesenswert?

Ich traute mir keine Schätzung zu. Aber mit mehr als 1000 lag ich dann 
ja doch nicht so schlecht. Tja die Geheimnisse der Statistik. Nun soll 
das der TO mal probieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.