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);
}
Mögliches Duplikat [Unique (nicht wiederholend) Zufallszahlen in O (1)?] (Http://stackoverflow.com/questions/196017/unique-non-repeating-random-numbers-in-o1) – Zong
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. –
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