2016-05-01 37 views
2

我想在我的遊戲服務器中做一個PVP事件,它使用3個區域隨機完成。我使用下面的代碼,但總是返回值1和2並重復以上。我需要像這樣的一些序列:3-2-1-2-1-3或者從不重複相同數字的東西。沒有重複的隨機數字的序列

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

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

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

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

這是我得到RND:

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; 
     } 
    } 

和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

O(1)中的[唯一(非重複)隨機數的可能重複?](http://stackoverflow.com/questions/196017/unique-non-repeating-random-numbers-in-o1) – Zong

+1

什麼隨機數字庫是'Rnd'?這似乎不是Java標準的「隨機」庫。無論如何,我懷疑你傳遞給'get'的最終值是**獨佔**,所以'get(1,3)'意味着給我一個大於或等於1的值,但是**嚴格小於** 3.如果是這樣,改成'get(1,4)'應該有效。 –

+1

請定義*「不要重複相同的數字」*考慮到'3-2-1-2-1-3'的示例顯示所有三個數字的重複。你是否意味着它應該在重新開始之前運行一系列非重複的數字?還是你的意思是說同一個號碼不可能彼此相鄰?或者是其他東西? – Andreas

回答

0

,如果您有1,2此代碼永遠不會重複的任何號碼,例如, 3你可以得到4個數字的隨機序列,例如2,1,3。

創建你需要的所有數字數組...

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

然後隨機選擇項目

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

我收到這行錯誤ArrayUtils.removeElement(a,random)錯誤說:方法removeElement(int [],int)是未定義的類型Arrayutils – b0rto

+1

我可以使用從我的來源ArrayUtils.remove(數組,值),但不符合你的代碼。感謝您的幫助.. – b0rto

+0

tnx我現在編輯它....我的例子沒有測試;-) –

0

[未測試]這是可能的,它可能包含一些語法錯誤,因爲我不是Java程序員。

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

感謝你們的幫助們..現在測試你的代碼。 – b0rto

+0

你好我測試了你的代碼,它返回像這樣的數字的安全:3-2-2-3-1-2-2-1-3-2-1-2-2總是重複數字2,然後是無效的因爲正在重複這些數字,無論如何謝謝你試圖幫助我。 – b0rto

+0

可能是它在一個函數中的代碼,你一次又一次地調用它,導致a和b的值每次都賦值爲零; a和b必須全局變量 –

1

如果你正在尋找的是一個不等於前一個隨機數返回則該解決方案更簡單:

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

你好,謝謝你的回答,你的代碼返回給我0,沒有工作。 – b0rto

0

你的問題歸結爲graph遍歷其中從每個當前區域,你只有2個可能的下一個區域,這些選擇永遠不會改變。因此,這裏是我將如何實現它:

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; 
    } 
} 

你會這樣稱呼它:

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

你好,測試和這個班回我一個不同的數字1 - 2 - 3,因爲沒有工作,感謝您的幫助傢伙,我仍然試圖解決它,只有3 fu cking隨機數,並不能做到這一點xD – b0rto

+0

數字secuence像1-2-3-1-2-3-1-2-3-1-2-3也是有效的 – b0rto

+0

getNextZone()將返回任何區域(1,2或3),不重複。這完全是隨機的。 – 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 }

你好我終於固定使用布爾和我得到這個secuence,1-2-3-1-2-3-1-2-3-1-2-3,我打破了我的想法,因爲這個代碼很混亂但它現在作爲一種魅力工作,感謝所有人試圖幫助我,我非常感謝它,偉大的社區。