java - java中没有重复的随机数
问题描述
我喜欢它:
int randOne = 3;
int randTwo = 4;
int oneNubmer;
int twoNumber;
do {
oneNubmer = 1 + (int) (Math.random() * randOne);
twoNumber = 1 + (int) (Math.random() * randTwo);
} while (oneNubmer == twoNumber);
它可以工作,但大大增加了操作时间,因为这个函数被调用了 1000+ 次。
如何做得更好?
解决方案
一旦你对生成的数字施加某些规则(例如它们不能重复),你就不能再认为它们是随机的了。
您可以考虑将 oneNumber 添加到 twoNumber(或在计算 twoNumber 时使用 oneNumber 的任何其他操作),这样它们就永远不会相等。尽管这再次强加了 twoNumber 总是高于 oneNumber 的事实,因此可以再次被视为对“随机”概念的破坏。
oneNumber = 1 + (int) (Math.random() * randOne);
twoNumber = 1 + oneNumber + (int) (Math.random() * randTwo);
对于您想要生成 1-4 之间的第一个数字和 1-5 之间的第二个数字而不重复的要求,您可以使用以下方法:
// Create a list containing numbers 1 till 5
List<Integer> numbers = new ArrayList<Integer>();
for(int i = 1; i < 6; i++) {
numbers.add(i);
}
Random random = new Random();
// Randomly get the index of your first number, this will be a number
// between 1 and 4
int firstIndex = random.nextInt(4);
int number1 = numbers.get(firstIndex);
// Remove that number from the list, your list now becomes size 4, and no
// longer contains the first number you picked.
numbers.remove(firstIndex);
// Randomly get the index of your second number, this will be a number
// between 1 and 5 without the number picked earlier.
int secondIndex = random.nextInt(4);
int number2 = numbers.get(secondIndex);
System.out.println(number1);
System.out.println(number2);
或者也许更干净,更快:
// Create a list containing numbers 1 till 5 -> might want to extract this
// from the method so you don't have to rebuild the array over and over
// again each call...
List<Integer> numbers = new ArrayList<Integer>();
for(int i = 1; i < 6; i++) {
numbers.add(i);
}
// Shuffle the array randomly
Collections.shuffle(numbers);
// Get the first 2 numbers from the array
int number1 = numbers.get(0);
int number2 = numbers.get(1);
// If number1 equals 5, swap number1 and number2 as you want number1 to be
// 1-4 and number2 to be 1-5
if(number1 == 5) {
number1 = number2;
number2 = 5;
}
System.out.println(number1);
System.out.println(number2);
推荐阅读
- python - 无法在 ec2 上运行 python sanic
- angular - 找不到模块:错误:无法解析“ngx-bootstrap”
- php - Codeigniter 4 - 在实时服务器上调用未定义的函数 App\Controllers\base_url()
- php - ApiPlatform : CustomSearchFilter : 学说为 andWhere 生成子请求
- css - css 中设置的颜色与显示的颜色不同
- c++ - 这是 C++ 中的错误吗?(书<
> 可能是错的?) - python - 展开熊猫数据框
- mysql - 如何将数据库中所有表中的字段之一更改为新值?
- c# - 如何在 ASP.NET Core 3.1 上运行的启用 OData 的 Web API 中添加 Swagger
- css - 在 MaterialUI 网格中垂直居中对齐按钮