如何生成随机数而不重复

时间:2015-02-17 17:11:26

标签: java android

我用这段代码生成一个随机数:

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

我想 停止生成重复的 号码,我想在我的应用再次打开后生成一个新号码。

我该怎么办?

5 个答案:

答案 0 :(得分:2)

将您生成的数字存储在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。使用数据库将是一种过度杀伤。

答案 1 :(得分:0)

这是一种可以确保没有重复的方法;

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;

答案 2 :(得分:0)

要在每个打开的应用中生成不同的值,您可以使用

System.currentTimeMillis()

这将返回long而不是int

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

也许请查看使用系统时间戳或您在应用程序之外保留的其他值(存储/数据库/等)中的数字播种。

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