Seite 1 von 2

risiko-problem mit 42 ländern[alter name: Ojeee - Zahlen...]

Verfasst: 12.02.2007 16:15
von DarkSoul
Ich habe zahlen von 1 - 42, jede einmal.

Nun möchte ich jede mögliche Reihenfolge ohne doppelte zu haben, um damit einige tests (die zahlen sind nämlich arrayindizen) anzustellen, etwa so wie das hier mit 3 zahlen:

123
132
321
312
213
231

Das 0-element der arrays muss aber bei 0 bleiben, weil ich es für die verwaltung der anderen 42 vergewaltigt habe!!!

Wie geht das möglichst schnell?

Verfasst: 12.02.2007 16:33
von bobobo
öö..

schätze, gar nicht
bei einer PermutationsReihe mit vielen bis allen Möglichkeiten komm ich
im Kopf schon auf ca 3 Hoch 49 verschiedene Möglichkeiten .. wie sowas
schnell gehen soll, weiß ich nicht :)

ps: Auf den Ausdruck der Zahlen bin ich gespannt :mrgreen:

Verfasst: 12.02.2007 16:51
von ZeHa
Korrekterweise sind es nicht 3^49 Möglichkeiten, sondern 42! (Fakultät) Möglichkeiten. Sind aber schon sehr viele ;)

Für was genau brauchst Du das denn? Vielleicht läßt sich Dein eigentliches Problem ja letztendlich auch anders lösen...

Verfasst: 12.02.2007 16:53
von bobobo
Wollt ja auch was anderes schreiben :oops: .. ne 3 mit reichlich (49) Nullen dran..

Hab's nochmal nachkopfgerechnet und komm nun eher auf ne 1 mit 51 Nullen dran

Verfasst: 12.02.2007 17:13
von STARGÅTE
1,4050061177528798985431426062445 * 10^51

um genau zu sein :-)

also ist die auflistung aller Zahlen UNMÖGLICH

Zum Vergleich um eine LONG zu speichern braucht man 4 Byte

man kann also mit einer 1 TByte (1024GByte) Festplatte

nur 2,74877906944 * 10^11 Zahlen speichern

Was du machen kannst ist :

Du lässt von einer Zufallsprocedure eine zufällige Kombination ausrechnen:

Code: Alles auswählen

Dim Zahlen.l(42)

Procedure FuelleMitZahlen()
 For n = 1 To 42 :
  Zahlen(n) = 0
 Next n
 n = 1
 Repeat
  Repeat
   FEHLER = 0
   Zahl = Random(41)+1
   For i = 1 To n-1 
    If Zahlen(i) = Zahl : FEHLER = 1 : EndIf
   Next i
  Until FEHLER = 0
  Zahlen(n) = Zahl
  n + 1
 Until n = 43
EndProcedure

FuelleMitZahlen()

For n = 1 To 42 :
 Debug Zahlen(n)
Next n
In Feld 1 bis 42 sind dann zufällig die Zahlen 1 bis 42 verteilt , natürlich ohne mehrfachnennung.

Verfasst: 12.02.2007 17:55
von DarkSoul
bastle gerade ein risikospiel zusammen, eigentlich fertig, aber was fehlt ist, eine truppe ins andere land, wo noch ein paar länder gleicher truppenfarbe zwischen sind, zu schieben, ohne sie von land z land zu schieben zu müssen. Dabei ist drauf zu achten, dass man keine gegnerischen ländern durchmarschieren kann.

Ich hoffe, das verwirrt jet nicht zu sehr:

Die länder sind unsere erdländer in paint gezeichnet. Nun wollte ich mit de zahlen folgende Ländergruppen rausfinden:

Bild
Derzeit sind nur blau und pink möglich. Es soll aber grün, also direkt mit einem zug möglich sein aber es dürfen keine andersfarbigen armeen übersprungen werden (also roter pfeil darf nicht möglich sein!) und durchs wasser laufen is nich!

Die direkten Ländergrenzen hab ich folgt gemacht:

Ich habe jedem Land ein Stringarray gegen, das seinen Namen enthält und ein weiteres Stringarray, das die namen der angrenzenden Länder enthält. Dann habe ich noch ein bytearray, das die Farbe, die gerade drauf ist, enthält.

So prüfe ich beim zug einfach das hier:

Code: Alles auswählen

Dim Besitzer.b(42)
Dim LandName.s(42)
Dim Grenzen.s(42)

;currentland hat die nummer des landes, von dem gezogen wurde und ziellandname$ den namen des landes, wo die maus draufzeigt. 
If FindString(Grenzen(CurrentLand),0,Ziellandname$)
 ;gültig
else
 ;ungültig
endif


Verfasst: 12.02.2007 18:08
von code2nil
STARGÅTE hat geschrieben:1,4050061177528798985431426062445 * 10^51

um genau zu sein :-)

also ist die auflistung aller Zahlen UNMÖGLICH

Zum Vergleich um eine LONG zu speichern braucht man 4 Byte

man kann also mit einer 1 TByte (1024GByte) Festplatte

nur 2,74877906944 * 10^11 Zahlen speichern

Was du machen kannst ist :

Du lässt von einer Zufallsprocedure eine zufällige Kombination ausrechnen:

Code: Alles auswählen

Dim Zahlen.l(42)

Procedure FuelleMitZahlen()
 For n = 1 To 42 :
  Zahlen(n) = 0
 Next n
 n = 1
 Repeat
  Repeat
   FEHLER = 0
   Zahl = Random(41)+1
   For i = 1 To n-1 
    If Zahlen(i) = Zahl : FEHLER = 1 : EndIf
   Next i
  Until FEHLER = 0
  Zahlen(n) = Zahl
  n + 1
 Until n = 43
EndProcedure

FuelleMitZahlen()

For n = 1 To 42 :
 Debug Zahlen(n)
Next n
In Feld 1 bis 42 sind dann zufällig die Zahlen 1 bis 42 verteilt , natürlich ohne mehrfachnennung.
Etwas effizienter dürfte das hier sein...

Code: Alles auswählen

EnableExplicit

Define Dimension.l = 42 
Global Dim Zahlen.l(Dimension-1) ;Indizes 0 bis Dimension-1
Declare FuelleMitZahlen(Dimension.l)
;-----------------------------------------------------------

FuelleMitZahlen(Dimension)

Define n.l
For n = 0 To Dimension-1
  Debug Zahlen(n)
Next n
End

;-----------------------------------------------------------
Procedure FuelleMitZahlen(Dimension.l)
  Define n.l
  For n = 0 To Dimension-1
   Zahlen(n) = n+1
  Next n
  
  Define Index.l = Dimension-1, ZufallsIndex.l
  While Index > 0 ;das erste Element muss nicht mit sich selbst gefüllt werden...
    ZufallsIndex = Random(Index)
    Swap Zahlen(Index), Zahlen(ZufallsIndex)
    index - 1
  Wend
EndProcedure
... da es ohne Trial&Error auskommt. ;-)

Verfasst: 12.02.2007 18:12
von DarkSoul
n zufallsgenerator nütz mir nichts. ich habe einen start und einen endpunkt wie auf der zeichnung oben, den der user festlegt und von x nach y geht. :wink:

Verfasst: 12.02.2007 18:27
von PMV
Hm, da brauchst ne Wegfindungs-Routine ... (Pathfind) :wink:
Du müsstest wissen, von welchem Land man zu welchem Land kommt,
mit diesen Daten kann man dann den Computer schauen lassen, ob es
einen weg von a nach b gibt. Ist das der Fall, kannste deine Figuren
bewegen. Aber leichter gesagt, als getan ...

Du könntest hier im Board dannach suchen, der A*-Algo wäre für dich
eine gute wahl, fals du das Bewegen von a nach z über b, c, d, e, f, ...
visual darstellen möchtest. Aber der wäre auch so ganz gut, da du mit ein
zwei mehr abfragen direkt nach finden einer Route aus der Schleife
rausspringen könntest.

Wikipedia erklärt den Algo natürlich auch: http://de.wikipedia.org/wiki/A*
(Link kopieren ... das Board mag keine * in der URL -.-)

MFG PMV

Verfasst: 12.02.2007 18:28
von STARGÅTE
Das wird mit so unregelmäßigen Feldern schwer :?

vllt kannst du ja die Karte für die Berechnungen in ein 2D Array packen und dann dort ne keine Wegfindungsprocedure anwenden.

@code2nil : OK deins wäre das klassische Karten mischen ^^

[EDIT] Verdammt bin schon wieder 1min zu spät, ich schreibe eifach zu langsam :-(