在Android中生成永不重复的数字,通常指的是在一个特定的上下文中(比如在一个应用会话期间或用户登录期间)生成一系列唯一的随机数字。这可以通过多种方式实现,下面给出一个简单的示例,展示如何在一个应用会话中生成一系列不重复的随机数字。

方法概述

  • 使用集合存储已生成的数字:创建一个集合来存储已经生成的随机数字,每次生成新数字时检查该集合,确保新数字未被使用过。
  • 预生成所有可能的数字并从中选择:如果数字范围有限,可以先生成所有可能的数字放入集合或列表中,然后从中随机选取。

示例代码

假设你需要生成一个范围内的不重复随机数字序列,例如生成1至100之间的不重复随机数字:

1. 使用HashSet存储已生成的数字

import android.util.SparseArray;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class UniqueNumberGenerator {

    private static final int MAX_NUMBER = 100; // 最大数字
    private Set<Integer> usedNumbers = new HashSet<>(); // 已经使用过的数字集合
    private Random random = new Random();

    /**
     * 生成一个不重复的随机数字
     * @return 不重复的随机数字
     */
    public int generateUniqueRandomNumber() {
        int randomNumber;
        do {
            randomNumber = random.nextInt(MAX_NUMBER) + 1; // 生成1至100之间的随机数
        } while (usedNumbers.contains(randomNumber)); // 检查是否已经使用过该数字
        usedNumbers.add(randomNumber); // 添加到已使用集合中
        return randomNumber;
    }

    /**
     * 清空已使用数字集合
     */
    public void reset() {
        usedNumbers.clear();
    }
}

2. 预生成所有可能的数字并从中选择

如果你知道数字的范围较小,并且可以接受预先生成所有的数字,可以采用以下方法:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class UniqueNumberGenerator {

    private List<Integer> availableNumbers = new ArrayList<>();

    public UniqueNumberGenerator(int maxNumber) {
        for (int i = 1; i <= maxNumber; i++) {
            availableNumbers.add(i);
        }
        Collections.shuffle(availableNumbers); // 打乱顺序
    }

    /**
     * 生成一个不重复的随机数字
     * @return 不重复的随机数字
     */
    public int generateUniqueRandomNumber() {
        if (availableNumbers.isEmpty()) {
            throw new IllegalStateException("No more unique numbers available.");
        }
        return availableNumbers.remove(0); // 移除并返回第一个元素
    }

    /**
     * 重置可用数字列表
     */
    public void reset() {
        availableNumbers.clear();
        for (int i = 1; i <= 100; i++) {
            availableNumbers.add(i);
        }
        Collections.shuffle(availableNumbers);
    }
}

使用示例

3在你的Activity或Fragment中使用上面定义的UniqueNumberGenerator类:

public class MainActivity extends AppCompatActivity {

    private UniqueNumberGenerator generator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        generator = new UniqueNumberGenerator();
        
        // 生成一个不重复的随机数字
        int uniqueNumber = generator.generateUniqueRandomNumber();
        Log.d("MainActivity", "Generated unique number: " + uniqueNumber);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 当Activity销毁时,重置生成器
        generator.reset();
    }
}

注意事项

  • 如果数字范围非常大,使用集合存储所有数字可能会消耗大量内存。此时,第一种方法可能更适合。
  • 如果数字范围较小,并且可以接受预先生成所有数字,第二种方法更为高效。
  • 请确保在适当的时机调用reset()方法,以便在需要时重置状态。