PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zufallsgenerator mit c-control basic



karl1987
08.08.2005, 00:31
Kann mir jemand den Quellcode eines Zufallsgenerators in cc-basic (c-control m-unit 2) geben? Er soll einen von acht Ausgängen auf Tastendruck auswählen. Danke!

SprinterSB
08.08.2005, 08:28
Zum Thema Zufall gab's vor kurzem nen Thread, vielleicht hilft dir das weiter:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11267&highlight=zufallszahl

Z80
08.08.2005, 09:20
In CC-Basic giebt es den Befel "rand" z.B. "x = rand"

karl1987
08.08.2005, 14:36
Mein Problem ist Folgendes:

Der Befehl RAND gibt einen zufälligen Wert zwischen -32768 bis +32767 aus.
Für 8 Ausgäng teilte ich diesen Bereich durch 8 und wies jedem Ausgang 1/8 zu. Wenn ich das Programm starte aktiviert sich jedoch bei jedem Durchgang standardmäßig Ausgang 6.
Sein Bereich liegt zwischen 8191 und 16383.
Wenn ich einen anderen Ausgang mit diesem Bereich definiere, so ist dieser andere Ausgang standardmäßig an.


(Ich beginne den Zufallsgenerator wiefolgt:

randomize x
y = RAND

x und y sind als WORD definiert.)


Kennt einer den Grund für dieses Verhalten?

Carbolo
08.08.2005, 15:49
Die Zufallszahlen aus der rand- Funktion sind keine wirklichen Zufallszahlen, eher Pseudo-Zufallszahlen. Sie wiederholen sich bei jeder Neustart der Funktion, da sie im System hinterlegt sind. Besser ist es, die rand- Funktion mit etwas veränderlichem zu verbinden, wie z.B. mit der Systemzeit.Unten ist so eine Verknüpfung zu sehen, die ich gerne benutze.
Das ist eine etwas ausführliche Lösung, es geht natürlich auch wesentlich kompakter. Bei diesem Programm geht es eher um d. Verstehen auch für nicht C- Leute :-)
Bei jeder Funktionsaufruf wird srand mit der Systemzeit initialisiert, d.h. es kommen jedesmal andere Werte raus. Die Variable Zufallsgrenze gibt den grösstmöglichen Zufallswert wieder. Null kann nicht Vorkommen, wenn doch gewünscht, einfach in der Funktion Zufall_f ändern.

Ich habe hier auf der Arbeit leider kein Visual C++, aber es müsste laufen :-)))


# include <stdio.h>
# include <stdlib.h>
# include <time.h>

int Zufall_f (int Zufallsgrenze);

int Zufallsgrenze=8;
int Zufallszahl=0;

void main (void)
{
srand ((unsigned)time(NULL));
Zufallszahl = Zufall_f (Zufallsgrenze);
printf(„Zufallszahl: \t\t %i \n\n“, Zufallszahl);
}


int Zufall_f (int Zufallsgrenze)
{
int Grenze,Pruef=1,c, Zahl=0;

Grenze = Zufallsgrenze+1;
for (c=0;Pruef==1;c++)
{
Zahl = rand ()%Grenze;
if (Zahl==0)
Pruef=1;
else
Pruef=2;
}

return Zahl;
}


Bei Fragen einfach mailen per PN :-)))

Schöne Grüße:
Z

Z80
08.08.2005, 15:54
Ist nicht die schönste lösung aber man kann damit 8 Ports zufällig schalten.

define a port[1]
define b port[2]
define c port[3]
define d port[4]
define e port[5]
define f port[6]
define g port[7]
define h port[8]
define x word
define y word

randomize x

y=rand
if y>0 then y=0
a=y

y=rand
if y>0 then y=0
b=y

y=rand
if y>0 then y=0
c=y

y=rand
if y>0 then y=0
d=y

y=rand
if y>0 then y=0
e=y

y=rand
if y>0 then y=0
f=y

y=rand
if y>0 then y=0
g=y

y=rand
if y>0 then y=0
h=y

end

Carbolo
08.08.2005, 16:00
Noch eine Möglichkeit:

Einen Zeiger Deklarieren, nicht initialisieren (es zeigt zufällig irgendwohin im Speicher) und dann auslesen. Müsste eigentlich auch einen Zufallswert ergeben. Beim Debuggen habe ich zumindest öfters diesen Fall :-) :-) :-)

Gruss :

Z