2016-05-01 17 views
2

Ich versuche, ein pvp-Ereignis in meinem Spieleserver zu machen, der 3 Zonen verwendet, um es zufällig zu tun. Ich benutze den folgenden Code, gebe mir aber immer die Werte 1 und 2 zurück und wiederhole es auch. Ich brauche eine Sequenz wie diese, zum Beispiel: 3-2-1-2-1-3 oder etwas, das niemals dieselbe Nummer wiederholt.Sequenz von Zufallszahlen ohne Wiederholungen

int random = Rnd.get(1, 3); 

if (random == 1) 
{ 
    setstartedpvpzone1(true); 
} 

if (random == 2) 
{ 
    setstartedpvpzone2(true); 
} 

if (random == 3) 
{ 
    setstartedpvpzone3(true); 
} 

das ist, was ich in rnd erhalten:

public final class Rnd 
{ 
    /** 
    * This class extends {@link java.util.Random} but do not compare and store atomically.<br> 
    * Instead it`s using a simple volatile flag to ensure reading and storing the whole 64bit seed chunk.<br> 
    * This implementation is much faster on parallel access, but may generate the same seed for 2 threads. 
    * @author Forsaiken 
    * @see java.util.Random 
    */ 
    public static final class NonAtomicRandom extends Random 
    { 
     private static final long serialVersionUID = 1L; 
     private volatile long _seed; 

     public NonAtomicRandom() 
     { 
      this(++SEED_UNIQUIFIER + System.nanoTime()); 
     } 

     public NonAtomicRandom(final long seed) 
     { 
      setSeed(seed); 
     } 

     @Override 
     public final int next(final int bits) 
     { 
      return (int) ((_seed = ((_seed * MULTIPLIER) + ADDEND) & MASK) >>> (48 - bits)); 
     } 

     @Override 
     public final void setSeed(final long seed) 
     { 
      _seed = (seed^MULTIPLIER) & MASK; 
     } 
    } 

und rnd.get:

/** 
* Gets a random integer number from min(inclusive) to max(inclusive) 
* @param min The minimum value 
* @param max The maximum value 
* @return A random integer number from min to max 
*/ 
public static final int get(final int min, final int max) 
{ 
    return rnd.get(min, max); 
} 
+3

Mögliches Duplikat [Unique (nicht wiederholend) Zufallszahlen in O (1)?] (Http://stackoverflow.com/questions/196017/unique-non-repeating-random-numbers-in-o1) – Zong

+1

Welche Zufallszahlenbibliothek ist 'Rnd'? Das scheint nicht die Java-Standardbibliothek "Random" zu sein. Wie auch immer, ich vermute, dass der Endwert, den du an 'get' übergibst, ** exklusiv ** ist, so dass 'get (1, 3)' bedeutet, dass du mir einen Wert größer oder gleich 1 aber ** strikt weniger als ** nimmst 3. Wenn dies der Fall ist, sollte der Wechsel zu "get (1, 4)" den gewünschten Erfolg bringen. –

+1

Bitte definieren Sie * "Niemals wiederholt die gleiche Nummer" *, da Ihr Beispiel von "3-2-1-2-1-3" Wiederholungen aller drei Zahlen zeigt. Meintest du, dass es eine vollständige Folge von sich nicht wiederholenden Zahlen vor dem Neubeginn ausführen sollte? Oder meintest du, dass die gleiche Nummer nicht direkt nebeneinander auftauchen darf? Oder etwas anderes? – Andreas

Antwort

0

Dieser Code nie irgendwelche Zahlen wiederholt, wenn Sie zum Beispiel 1,2 haben, 3 können Sie eine zufällige Folge von 4 Zahlen erhalten, Beispiel 2,1,3.

ein Array mit allen Zahlen Erstellen Sie brauchen ...

int[] a = {1, 2, 3}; 

Dann zufällige Elemente auswählen

for (int i=0; i<a.length; i++){ 
     int random = Rnd.get(0, a.length); 
     //remove the selected item from the array 
     ArrayUtils.removeElement(a, random); 

     if (random == 1) { 
      setstartedpvpzone1(true); 
     } else if (random == 2) { 
      setstartedpvpzone2(true); 
     } else if (random == 3) { 
      setstartedpvpzone3(true); 
     } 
    } 
+0

Ich erhalte Fehler in dieser Zeile ArrayUtils.removeElement (a, random) der Fehler sagt: Die Methode removeElement (int [], int) ist für den Typ Arrayutils – b0rto

+1

undefined ich kann das aus meinen Quellen verwenden ArrayUtils.remove (Array, Wert), aber passen Sie nicht mit Ihrem Code zusammen. danke für deine hilfe .. – b0rto

+0

tnx ich bearbeite es jetzt .... mein beispiel wurde nicht getestet ;-) –

0

[nicht getestet] Es ist möglich, dass es einige Syntaxfehler enthalten kann, wie ich bin kein Java-Programmierer.

int a=0,b=0; 
    while(true) 
    { 
     int random = Rnd.get(1, 3); 
     if(!(a==random or b==random)) 
     { 
      a=b; 
      b=random; 
      break; 
     } 
    } 

if (random == 1) 
{ 
    setstartedpvpzone1(true); 
} 

if (random == 2) 
{ 
    setstartedpvpzone2(true); 
} 

if (random == 3) 
{ 
    setstartedpvpzone3(true); 
} 
+0

danke für Ihre Hilfe Jungs..im testet Ihren Code jetzt. – b0rto

+0

hallo, ich habe Ihren Code getestet und es gibt die Anzahl der Zahlen wie folgt zurück: 3-2-2-3-1-2-2-1-3-2-1-2-2 immer die Zahl 2 wiederholen, dann ist nicht gültig weil ich die Nummern wiederhole, trotzdem danke, dass ihr mir helfen wollt. – b0rto

+0

kann es Code in einer Funktion sein, die Sie immer wieder aufrufen, die Ursache Wert von a und b jedes Mal Null zuweisen; a und b muss globale Variable –

1

Wenn alle Sie suchen, eine Zufallszahl ist, die nicht die vorherigen nicht gleich zurück dann die Lösung ist viel einfacher:

private Random random = new Random(); 
private int previousZone = 0; 

public int nextZone() { 
    int zone; 
    do { 
     zone = random.nextInt(3) + 1; 
    } while (zone == previousZone); 

    previousZone = zone; //store last "generated" zone 

    return zone; 
} 
+0

Hallo danke für Ihre Antwort, Ihr Code gibt mir 0, nein hat funktioniert. – b0rto

0

Ihr Problem zu einem graph Traversal läuft darauf hinaus, in denen Von jeder aktuellen Zone haben Sie nur 2 mögliche nächste Zonen und diese Auswahl ändert sich nie. Also hier ist, wie ich es umsetzen würde:

public static class EventLocator{ 
    private int currentZone; 
    private Random random; 
    private Map<Integer, int[]> locations; 
    private static EventLocator instance; 

    private EventLocator() { 
    } 

    public static EventLocator getInstance(){ 
     if (instance == null) { 
      instance = new EventLocator(); 
     } 
     return instance; 

    } 

    public int getNextZone(){ 
     if (this.currentZone == 0) {//first time called 
      this.random = new Random(); 
      this.locations = new HashMap<>(3);//graph <currentZone, posibleZones> 
      this.locations.put(1, new int[] { 2, 3 }); 
      this.locations.put(2, new int[] { 1, 3 }); 
      this.locations.put(3, new int[] { 1, 2 }); 

      this.currentZone = this.random.nextInt(3) + 1;// to 1-based Zones 
      return currentZone; 
     } 
     int[] possibleZones = this.locations.get(this.currentZone); 
     int randomIndex = this.random.nextInt(2);//0 or 1 index 
     this.currentZone = possibleZones[randomIndex]; 
     return this.currentZone; 
    } 
} 

Sie nennen würde es mögen:

EventLocator eventLocator = MyProgram.EventLocator.getInstance(); 
System.out.println(eventLocator.getNextZone()); 
System.out.println(eventLocator.getNextZone()); 
+0

hallo getestet und diese Klasse gibt mir eine Nummer anders als 1 - 2 - 3 weil nein funktioniert, danke für Ihre Hilfe Jungs, ich versuche immer noch, es zu reparieren, nur 3 fu cking Zufallszahl und kann es nicht tun xD – b0rto

+0

ein paar Zahlen wie 1-2-3-1-2-3-1-2-3-1-2-3 gilt auch – b0rto

+0

die getNextZone() wird keine Zone (1,2 oder 3), ohne Wiederholung. Es ist total zufällig. – PedroJ

0

\t private boolean _lastevent1 = false; 
 
\t 
 
\t public boolean lastevent1() 
 
\t { 
 
\t \t 
 
\t \t return _lastevent1; 
 
\t } 
 
\t 
 
\t public void setlastevent1(boolean val) 
 
\t { 
 
\t \t _lastevent1 = val; 
 
\t } 
 
\t 
 
\t private boolean _lastevent2 = false; 
 
\t 
 
\t public boolean lastevent2() 
 
\t { 
 
\t \t 
 
\t \t return _lastevent2; 
 
\t } 
 
\t 
 
\t public void setlastevent2(boolean val) 
 
\t { 
 
\t \t _lastevent2 = val; 
 
\t } 
 
\t 
 
\t private boolean _lastevent3 = false; 
 
\t 
 
\t public boolean lastevent3() 
 
\t { 
 
\t \t 
 
\t \t return _lastevent3; 
 
\t } 
 
\t 
 
\t public void setlastevent3(boolean val) 
 
\t { 
 
\t \t _lastevent3 = val; 
 
\t }

\t \t \t \t if (!lastevent1()) 
 
\t \t \t \t { 
 
\t \t \t \t \t setlastevent3(false); 
 
\t \t \t \t \t setstartedpvpzone3(false); 
 
\t \t \t \t \t 
 
\t \t \t \t \t setstartedpvpzone1(true); 
 
\t \t \t \t \t setlastevent1(true); 
 
\t \t \t \t } 
 
\t \t \t \t 
 
\t \t \t \t else if (!lastevent2()) 
 
\t \t \t \t { 
 
\t \t \t \t \t setstartedpvpzone1(false); 
 
\t \t \t \t \t setstartedpvpzone2(true); 
 
\t \t \t \t \t setlastevent2(true); 
 
\t \t \t \t } 
 
\t \t \t \t 
 
\t \t \t \t else if (!lastevent3()) 
 
\t \t \t \t { 
 
\t \t \t \t \t setlastevent1(false); 
 
\t \t \t \t \t setlastevent2(false); 
 
\t \t \t \t \t 
 
\t \t \t \t \t setstartedpvpzone2(false); 
 
\t \t \t \t \t setstartedpvpzone3(true); 
 
\t \t \t \t \t setlastevent3(true); 
 
\t \t \t \t }

hallo endlich habe ich mit Booleans behoben und ich bekomme diese secunce, 1-2-3-1-2-3-1-2-3-1-2-3, ich habe meinen Verstand damit gebrochen, weil dieser Code sehr verwirrt ist aber es funktioniert jetzt als ein Charme, danke für alle zu versuchen, mir zu helfen, ich schätze es sehr, großartige Gemeinschaft.

Verwandte Themen