Brauche "todsichere" Zufallszahlen

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

x-pressive

Betreff: Brauche "todsichere" Zufallszahlen

BeitragSa, Sep 03, 2005 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
In meinem Game läuft so einiges über Zufall -wenn aber mehrere Spieler im Multiplayer-Modus zusammenspielen, ist es ja wichtig, daß bei allen genau das selbe passiert. Da gibt es ja dann zwei Möglichkeiten, oder?

1. Der Host erzeugt ALLE Zufallswerte und sendet diese an ALLE Teilnehmer

2. Man benutzt einen Algo, der todsicher auf allen Rechnern die selbe Zufallszahl ergibt.

1) wäre sicher, aber ein wenig aufwändig.
2) Wäre mir deshalb lieber -aber wie könnte man das lösen? Ich dachte z.B. daran, daß der Host beim Spielstart ein SeedRnd MilliSecs() ausführt und seinen momentanen MilliSecs()-Wert an alle Teilnehmer schickt. Dann müssten doch eigentlich jedesmal, wenn Rand() auf einem der Rechner ausgeführt wird, überall die selben Zufallszahlen rauskommen oder?

Ich habe das mal getestet mit SeedRnd 1 -dummerweise kommen aber auch hier immer wieder andere Werte. Ich dachte eigentlich, daß die Reihenfolge der Zahlen, die Rand() liefer, immer die selbe ist, wenn man auch immer den selben Wert bei SeedRnd benutzt. Scheint aber doch nicht so.

Kann mich jemand erleuchten...? Confused
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

stfighter01

BeitragSa, Sep 03, 2005 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
vermutlich hast du da noch was anderes übersehen.

wie oft wird rand() aufgerufen?
wenn du den spielverlauf mit einem timer updatest kann es ja durchaus passieren das du mal ein update überspringtst weil der pc kurz geladen hat oder so.
jedenfalls würde ich mich auf solcherart syncronisierung nicht verlassen.
besser du schickst alle 2 frames od. so ein neues randseed mit.
inwiefern der algo vom betriebssystem abhängig ist weiss ich nicht, aber an u. für sich werden mit dem selben randseed die selben zahlenfolgen erzeugt.

mfg stf

p.s: bei mir funktionierts einwandfrei
letzte zahl: 658
Code: [AUSKLAPPEN]

SeedRnd 100


For i = 0 To 100000
   Print Rand(0, 1000)
Next
WaitKey()
Denken hilft!

x-pressive

BeitragSa, Sep 03, 2005 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das kommt bei mir auch raus, hmm... vielleicht lag's doch an etwas anderem.

stfighter01 hat Folgendes geschrieben:
wie oft wird rand() aufgerufen?

SEHR oft -aber es müsste doch jedesmal bei allen die selbe Zahl rauskommen, wenn alle mit der selben Zahl ein SeedRnd() ausgeführt haben, -sofern alle PC's Rand() genau in der gleichen Häufigkeit aufrufen. Wenn einer es einmal zu oft ausführt, hat er wohl schon die nächste Zahl -denn bei einem SeedRnd() mit fester Zahl zählt ja die Reihenfolge, in der Rand() aufgerufen wird, oder sehe ich das falsch?

NEBENBEI AN DEN ADMIN:
Eine Suche nach "Rand" liefert sage und schreibe 738 Ergebnisse (jetzt 739!), weil man noch immer nicht "nur Titel durchsuchen" angeben kann. Somit ist die Suchfunktion NUTZLOS!
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Spikespine

BeitragSa, Sep 03, 2005 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
x-pressive hat Folgendes geschrieben:
NEBENBEI AN DEN ADMIN:
Eine Suche nach "Rand" liefert sage und schreibe 738 Ergebnisse (jetzt 739!), weil man noch immer nicht "nur Titel durchsuchen" angeben kann. Somit ist die Suchfunktion NUTZLOS!


Bei mir gehts...
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

Hip Teen

BeitragSa, Sep 03, 2005 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, zum Thema suche folgendes Bild
user posted image
Rolling Eyes
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger"

x-pressive

BeitragSa, Sep 03, 2005 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hurra, die Option wurde ja doch endlich mal zugefügt! Very Happy Ich war's schon so gewohnt, daß mir das gar nicht gleich aufgefallen ist. Dickes Lob an den Admin, ich nehm's wieder zurück. Das macht die Suche doch gleich hundert mal effizienter.

Bin aber immer noch am Grübeln, wie ich das mit den Zufallswerten am besten mache... das Spiel ist rundenbasiert -und in jeder Runde entscheidet oft der Zufall, welche Felder jeder Spieler belegt, oder wie weit er gehen kann. Soll nun der Host alle Zufallswerte im Voraus erzeugen und an alle Teilnehmer schicken -oder jeder Teilnehmer für sich und an den Host schicken... hat schon mal jemand etwas in der Richtung gemacht?
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL
 

Absoluter Beginner

BeitragSa, Sep 03, 2005 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Das soll der beste sein
http://www.math.sci.hiroshima-...T/emt.html
Error Inside!

x-pressive

BeitragSa, Sep 03, 2005 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, schon wieder ein Nur-schnell-den-Titel-und-sonst-nix-Leser Wink Und wie kann mir das jetzt bei oben beschriebenem Problem helfen Question
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Plasma(alt)

Betreff: hmm

BeitragSa, Sep 03, 2005 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
was ist wenn du ein zufallsdatenfeld im spiel integrierst und der server nur
die startzahl und oder stoppzahl angiebt ?

dieses feld müsste auf allen clients dieselben werte haben ,der server
macht das rand(xxx) und die clients spielen die tabelle ab bis ein neues
rand(xxx) kommt oder die tabelle abgearbeitet ist ?

ps. icht dachte rand (xxx) erzeugt auf allen rechnern immer die gleiche sequenz wenn es mit demselben seedrnd(xxx) gestartet wurde ?
DIV is dead !

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Sep 03, 2005 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin mir nicht sicher ob man davon ausgehen kann das der Zufallsgenerator auch in zukünftigen oder anderen Systemen wie zB Mac auch immer die selben 'Zufallszahlen' generiert. Eine Möglichkeit währe, daß der Server zu Anfang eine Zufallsreihenfolge von zB 100 Zahlen an alle Clients sendet und diese es in ein Dim oder so ablegen...

[EDIT] Du generierst dir dann pro Runde deine eigene Zufallszahlen, die auf allen Systemen immer die gleichen Ergebnisse ergeben mit zB dem Mod -Befehl. Indem du eine sinnlose Rechnung durchführst und das Ergebnis per Mod aufteilst.
 

Absoluter Beginner

BeitragSa, Sep 03, 2005 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
x-pressive hat Folgendes geschrieben:
Oh, schon wieder ein Nur-schnell-den-Titel-und-sonst-nix-Leser Wink Und wie kann mir das jetzt bei oben beschriebenem Problem helfen Question


Du guchst dir an wie MT funktioniert und implementierst den in dein BB Prog, ich nehme mal an er ist Hardwareunabhängig und braucht auch ein Seed ... dann müsste er eigentlich überall die gleichen Zufallszahlen erzeugen
Error Inside!

stfighter01

BeitragSa, Sep 03, 2005 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
@hectic
ganz so einfach ist es nicht, da bilden sich schnell kurze perioden u. vorausschaubare ergebnisse.

aber gute algos gibts ja schon zuhauf: also suchen u. finden.
Denken hilft!

Kabelbinder

Sieger des WM-Contest 2006

BeitragSa, Sep 03, 2005 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm...

Vielleicht könntest du da ja auch von CURRENTTIME$ () Alle einzelnen Zahlen Zusammenrechnen und daraus die Seed für zufallszahlen machen.

Die Uhrzeit ist doch bei allen Computer Mitteleuropäischer Zeit gliech, oder?

Edit: Obwohl... Eigentlich Unsinn. Dann kann man eigentlich auch gleich überall die gleiche Zahl nehmen Sad . Sry
<Wing Avenger Download> ◊◊◊ <Macrophage Download>
  • Zuletzt bearbeitet von Kabelbinder am Sa, Sep 03, 2005 21:59, insgesamt einmal bearbeitet

BlitzChecker

BeitragSa, Sep 03, 2005 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest doch auchBlitzBasic z.B. 1000 Zufallszahlen in eine Datei schreiben lassen. Jeder Rechner hat dann die gleiche Datei und nimmt immer die nächste Zahl. Wenn bei jedem Rechner gleich oft die Zahl ausgelesen wir, sollte es doch eigentlich klappen. Rolling Eyes

BlitzBasic: [AUSKLAPPEN]

SeedRnd MilliSecs()
minimal = 0
maximal = 100
datei = WriteFile(\"Zahlen.txt\")
For i = 1 To 1000
WriteLine datei, Rand(minimal,maximal)
Next
CloseFile datei
www.xairro.com

Kabelbinder

Sieger des WM-Contest 2006

BeitragSa, Sep 03, 2005 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin es noch einmal.

Vielleicht geht das ja auch mit einem Dekoder hab ich überlegt.

Ich hab mal eine Art Dekoder Funktion geschrieben. Mit der kann man auch Zufallszahlen erzeugen, wenn man einen Wert (seed) hat der sich Ständig ändert.
Wenn der wert mehrmals hintereinander der gleiche ist kommen auch die gleichen Zahlen raus:
Code: [AUSKLAPPEN]
Function decode(min,max,seed)

room = max-min
wank# = seed Mod 999

wank = wank / 998 * room

wank = wank + min

Return wank
End Function


min und max wie bei Rand() einfach; und seed ist der Wert, der sich ändern muss (aber bei allen Spielern gleich sein muss).
seed sollte auch möglichst größer als 999 sein.

Das würde glaub ich echt so gehn.
Du brauchst nur irgendeinen wert, der bei Allen Spieler gleich ist und sich dabei andauernd verändert...
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

stfighter01

BeitragSa, Sep 03, 2005 23:54
Antworten mit Zitat
Benutzer-Profile anzeigen
och kommt schon jungs, verzapft nicht soviel unsinn Rolling Eyes
Denken hilft!

Ctuchik

BeitragSo, Sep 04, 2005 1:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kenn mich zwar nicht mit Netzcodes aus, aber ich denke der "todsichere" Weg ist die Berechnungen über den Server laufen zu lassen.
Der Server aktualisiert alle Objekte bei denen der Zufall ins Spiel kommt und schickt dann die aktualisierten Werte an die Clients.
Ich weiss nicht genau wo bei deinem Spiel überall Zufallszahlen benutzt werden, aber Sachen wie Spielerpositionen o.ä. müssen ja sowieso ständig verschickt werden.

Mehr kann ich dazu nicht sagen, weil ich mich wie gesagt mit Netzwerk nicht auskenne.

MfG Ctuchik
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Sep 04, 2005 1:50
Antworten mit Zitat
Benutzer-Profile anzeigen
stfighter01 hat Folgendes geschrieben:
@hectic
ganz so einfach ist es nicht, da bilden sich schnell kurze perioden u. vorausschaubare ergebnisse.

aber gute algos gibts ja schon zuhauf: also suchen u. finden.

Hallo stfighter, habe mir das auch so gedacht, daß pro Runde die vom Server gesendeten 100 Zahlen nacheinander durchlaufen werden. Aber die einzelnen Aktionen (zB Figur 1 soll rechts/links?, Figur 2 soll rechts/links?) dann halt per einfacher Mod-und-trallala-Rechnung entschieden werden.

zB erste Zahl vom Server 3783
Dann Figur 1 = if (1*3783/7.777 mod 2)=1 then rechts else links
Dann Figur 2 = if (2*3783/7.777 mod 2)=1 then rechts else links...

Dann Spielrunde fertig. Dann zweite Zahl vom Server. usw...

(Kann sein das hier jetzt ein Fehler in der Mod-Rechnung ist, habs nicht überprüft)

x-pressive

BeitragSo, Sep 04, 2005 5:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sind sehr brauchbare Ansätze -aber das ist kniffliger, als ich zuerst dachte. Eigentlich kann man das Problem ja in zwei Komponenten aufteilen:

1.) Man braucht eine Liste "todsicherer" Zufallszahlen -ob diese nun von einem Generator erzeugt werden, oder von einem Teilnehmer vorgegeben und an die anderen Teilnehmer geschickt werden (nur letzteres wäre wohl wirklich sicher). Das könnte man lösen, in dem der aktuelle Spieler einfach pro Runde eine vordefinierte Liste an Zufallszahlen an alle Teilnehmer sendet, aus der sie sich bedienen.

2.) Man muß dann aber sicher gehen, daß jeder Teilnehmer in genau der gleichen Reihenfolge und genau der gleichen Anzahl die Zufallswerte benutzt, weil die Teilnehmer sonst aus der Synchronisation geraten und einer von ihnen vielleicht schon eine Zahl weiter ist -und ab dann immer andere Zahlen bekommt. Es darf pro Runde also nichts "unvorhergesehenes" auf einem Client-Rechner passieren, das z.B. eine weitere Zufallszahl aus der Liste benötigt, weil sonst alle Teilnehmer aus dem Takt kommen.

Mir sind mal zwei verschiedene Möglichkeiten in den Sinn gekommen:

Lösungs-Vorschlag A)
Wenn man wirklich GANZ SICHER ist, daß bei keinem der Teilnehmer etwas "unvorhergesehenes" passiert, kann man das so machen, daß der Spieler, der gerade am Zug ist, am Anfang seiner Runde alle möglichen für diese Runde benötigten Zufallszahlen generiert und diese Liste an die Teilnehmer schickt. Diese lassen dann die ganze Runde selbstständig ablaufen. Dazu müsste man aber eine ganze Runde im voraus planen und schon mal genau wissen, welche Zufallszahlen benötigt werden.

Lösungs-Vorschlag B)
Der Spieler, der gerade am Zug ist, wird zum "Host" und gibt allen anderen Teilnehmern jeden einzelnen Schritt der aktuellen Runde vor. Das heisst also, jedesmal, wenn eine Zufallszahl benötigt wird, müssen alle Clients anhalten und darauf warten, daß der aktuelle Spieler (Host) ihnen die Zufallszahl schickt. Dann erst können sie weitermachen -bis zur nächsten Zufallszahl. Dadurch könnten aber vielleicht auffällige Pausen auf einem Computer entstehen, da ja das Spiel nicht auf jedem Computer auf die Millisekunde gleich schnell läuft. Und wenn in einer Action-Sequenz mit viel Bewegung mal schnell eine Zufallszahl benötigt wird, und ein Computer anhalten muß, bis der aktuelle Host allen die nächste Zahl liefert, bemerkt man auf jeden Fall eine Pause.

Knifflig, nicht wahr? Confused

EDIT: Bin noch mal den ganzen Programmcode durchgegangen und zum Schluß gekommen, daß eigentlich nur Lösung B) möglich ist. Bei Lösung A) müsste man nämlich eine ganze Runde mit allen möglichen Ereignissen(!) vorberechnen, was ziemlich aufwändig wäre. Grübel...
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

soli

BeitragSo, Sep 04, 2005 6:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Wir hatten hier mal eine Diskussion bei der rauskam,
das allein schon die verschiedenen Blitz Versionen,
bei gleichem Seed unterschiedliche Zahlenkolonnen liefern.
Es wird dir nichts anderes übrig bleiben, als die Zahlen
von einem "Host" zu verschicken.
Wie du das dann genau machst, ist halb die Frage.
solitaire

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group