簡體   English   中英

如何生成隨機數而不重復

[英]How to generate random numbers without repetition

我用這段代碼生成一個隨機數:

int randomNumber = (int) (Math.random() * 7);

我想停止生成重復的數字,我想在我的應用再次打開后生成一個新的數字。

我能怎么做 ?

將您生成的數字存儲在Set 然后,每次生成新的隨機數時,請測試它在本Set已存在。

Set<Integer> nums = new HashSet<Integer>();

// Initialize set on app boot

int rnum;
do {
  rnum = (int) (Math.random() * 7);
} while (!nums.contains(rnum));

// Update the set
nums.add(rnum);

// Use rnum now..

您還需要在應用關閉之前保留Set值; onPause()onStop()方法中。 您可以使用SharedPreferences或簡單地序列化/反序列化Set 使用數據庫將是一種過度殺傷力。

這是一種可以確保沒有重復的方法;

public int generateRandomNumber(){
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
final int lastNumber = sp.getInt("lastNumber", 0);
int randomNumber = (int) (Math.random() * 7);
while(randomNumber == lastNumber){
randomNumber = (int) (Math.random() *7);
}
sp.edit().putInt("lastNumber", randomNumber).apply();
return randomNumber;
}

編輯:這是一個愚蠢的方式來做你想要的:

String _p = sp.getString("previousNumbers", "");
String[] previousNumbers = _p.split(";");
int randomNumber = (int) (Math.random() * 7);
while(Arrays.asList(previousNumbers).contains(Integer.toString(randomNumber))
{
randomNumber = (int) (Math.random() * 7);
}
_p.concat(Integer.toString(randomNumber) + ";");
sp.edit().putString("previousNumbers",_p).apply();
return randomNumber;

要在每個打開的應用程序中生成不同的值,您可以使

System.currentTimeMillis()

這將返回long而不是int

第1步:創建數組

第2步:使用正確的數字填充數組

第3步:隨機播放陣列。

private Integer[] randomNumbersRange(int numberRange) {
    //Create and shuffle array
    Integer[] randomNumbers = new Integer[numberRange];
    for (int i = 0; i < randomNumbers.length; i++) {
        randomNumbers[i] = 1 + i;
    }
    Collections.shuffle(Arrays.asList(randomNumbers));
    return randomNumbers;
}

也許請查看使用系統時間戳或您在應用程序外部保留的其他值(在存儲/數據庫/等中)播種您的號碼。

https://developer.android.com/reference/java/util/Random.html#setSeed(long)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM