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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

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

Beitrag 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?
Zuletzt geändert von DarkSoul am 12.02.2007 18:00, insgesamt 1-mal geändert.
Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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...
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag 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

Bild
code2nil
Beiträge: 9
Registriert: 17.09.2004 09:39
Wohnort: Nähe K/BN/SU/GM

Beitrag 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. ;-)
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag 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:
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 :-(
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten