Java 快速生成随机列元素的方法
我有一个简单的问题,我需要一个快速的方法来实现。 假设我有两列,比如Java 快速生成随机列元素的方法,java,algorithm,actionscript-3,random,Java,Algorithm,Actionscript 3,Random,我有一个简单的问题,我需要一个快速的方法来实现。 假设我有两列,比如 1 6 3 5 5 3 如您所见,元素3和5在第二列中,我想在第一列中生成一个新的随机元素,这样第二列中就不会有匹配的元素。元素可以是1->12 我的方法是:我将第2列中的所有元素添加到一个散列集中,然后搜索第1列中的元素,并检查它们是否在散列集中,如果是这样,尝试生成一个新的随机元素 我还有另一个想法,将问题可视化为一维数组,删除重复项等等,但我不想修改第二个数组中的任何元素 将列2值放入HashSet 只需使用(Ma
1 6
3 5
5 3
如您所见,元素3和5在第二列中,我想在第一列中生成一个新的随机元素,这样第二列中就不会有匹配的元素。元素可以是1->12
我的方法是:我将第2列中的所有元素添加到一个散列集中,然后搜索第1列中的元素,并检查它们是否在散列集中,如果是这样,尝试生成一个新的随机元素
我还有另一个想法,将问题可视化为一维数组,删除重复项等等,但我不想修改第二个数组中的任何元素
列2
值放入HashSet
(Math.random()*12)+1
,它将生成从1到12的数字set
中(如果存在于set
中),然后重新生成,即转到步骤2,否则完成O(1)
我只取了一个小样本,即5个
a[]={1,2,3,4,5}
我认为这是一个相当直截了当的解决办法
Random r = new Random();
List<Integer> numbers = new ArrayList<>(Arrays.asList(new Integer[] {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }));
Integer[] colOne = new Integer[] { 6, 5, 3 };
numbers.removeAll(Arrays.asList(colOne));
int notFoundInColOne = numbers.get(r.nextInt(numbers.size()));
Random r=new Random();
列表编号=新的ArrayList(Arrays.asList(新整数[]){
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }));
整数[]冒号=新整数[]{6,5,3};
numbers.removeAll(Arrays.asList(colOne));
int-notFoundInColOne=numbers.get(r.nextInt(numbers.size());
基本上,我们创建范围,删除范围中也在列中的元素,然后从范围中剩余的元素中选择一个随机元素。我认为这种方法对您有效:对于从1到12的每个数字,如果数字不在列2中,则将其添加到列表中。列1未填充时,从列表中随机选择一个项目并将其删除,然后将其添加到列1。您可以使用以下步骤: 1.创建一个数组。 2.用最小值填充到最大值。 3.让阵势弥漫。按顺序读取数组
将Fisher–Yates shuffle算法用于suffle为什么当第二列有重复的数字时,您的方法会失败?因此您希望第1列中的数据永远不会出现在第2列中?如果第1列中有重复的数字,该怎么办。有什么问题吗?因为您需要再次进行另一个循环,以检查所选的随机数是否再次出现在集合中,这就增加了第二种方法的总体复杂性,如何确保第二列中没有重复的元素?@AhmedSaleh上面的代码总是生成从1到5的唯一数字。一点也不重复。对于第二列,它们应该是唯一的,但不是它们自己。