关于随机生成数的算法,保证范围内的所有数字都将被选择一次
Algorithm on random generated numbers with guaranteed that all numbers within the range will be selected once
我在想出一个问题的解决方案时遇到了一些问题,我目前仍在思考过程中。所以基本上问题是随机生成0到12之间的数字,并让这两个数字在一个时间范围内进行乘法。
但是,提供的解决方案必须保证最终必须显示所有169个随机生成的数字对,所以不能随机select一个数字。我在想在这种情况下为随机 selected 数字添加权重有帮助吗?或者有更好的方法吗?
谢谢!
这归结为:您并不真的希望数字对是随机的,因为随机值意味着您的下一个值不依赖于任何先前的值。
相反,您希望出现 169 个已知数字对,每个只出现一次,但您希望它们的顺序是随机的。
就好像这些数字对印在扑克牌上,而你在洗牌。
而 Java 有一个很好的方法:Collections.shuffle
就像专业发牌人一样洗牌。
您想要一种首先生成所有扑克牌,然后再洗牌的方法。像这样:
List<Integer[]> l = new ArrayList<>();
for (int x = 0; x <= 12; x++) {
for (int y = 0; y <= 12; y++) {
l.add(new Integer[] {x, y});
}
}
Collections.shuffle(l);
我在想出一个问题的解决方案时遇到了一些问题,我目前仍在思考过程中。所以基本上问题是随机生成0到12之间的数字,并让这两个数字在一个时间范围内进行乘法。
但是,提供的解决方案必须保证最终必须显示所有169个随机生成的数字对,所以不能随机select一个数字。我在想在这种情况下为随机 selected 数字添加权重有帮助吗?或者有更好的方法吗?
谢谢!
这归结为:您并不真的希望数字对是随机的,因为随机值意味着您的下一个值不依赖于任何先前的值。 相反,您希望出现 169 个已知数字对,每个只出现一次,但您希望它们的顺序是随机的。
就好像这些数字对印在扑克牌上,而你在洗牌。
而 Java 有一个很好的方法:Collections.shuffle
就像专业发牌人一样洗牌。
您想要一种首先生成所有扑克牌,然后再洗牌的方法。像这样:
List<Integer[]> l = new ArrayList<>();
for (int x = 0; x <= 12; x++) {
for (int y = 0; y <= 12; y++) {
l.add(new Integer[] {x, y});
}
}
Collections.shuffle(l);