快速生成随机列元素的方法

时间:2013-11-12 00:07:05

标签: java algorithm actionscript-3 random

我有一个简单的问题,我需要一种快速的方法来实现这一目标。 假设我有两列,如

1 6 
3 5
5 3 

如您所见,第2列中有元素3和5,我想在第一列中生成一个新的随机元素,这样第二列中就没有匹配的元素。元素可以是1 - > 12

我的方法:我已将第二列中的所有元素添加到哈希集中,然后我搜索第一列中的元素,并检查它们是否在哈希集中,如果这是真的,请尝试生成一个新的随机元素。

我有另一个想法是将问题可视化为一维数组,删除重复项,等等,但我不想修改第二个数组中的任何元素。

4 个答案:

答案 0 :(得分:0)

  1. column2值添加到HashSet

  2. 只需使用(Math.random() * 12)+1即可生成1到12号的数字。

  3. 现在搜索set中生成的数字是否存在于set而不是重新生成,即转到步骤2,否则完成。

  4. 希望它有所帮助。

    编辑

    O(1)

    我只拿了一个小样本,即5

    1. 首先创建一个比a [] = {1, 2, 3, 4, 5}
    2. 少1到5的数组
    3. 现在尝试生成1到5的随机数(这里是生成数组的索引),假设它生成2而不是将最后一个元素替换为2。所以现在数组将是[] = {1,5,3,4}并递减索引值。
    4. 现在你必须从1到4生成一个随机数。让我们假设3比交换3和最后一个值。所以数组是{1,5,4}。减少指数,即现在为3。

答案 1 :(得分:0)

我认为这是一个相当直接的解决方案

    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()));

基本上我们创建了我们的范围,删除了列中也包含的元素,然后从剩下的范围中选择一个随机元素。

答案 2 :(得分:0)

我认为这种方法适用于您:对于1到12之间的每个数字,如果数字不在第2列,则将其添加到列表中。第1列未填充时,从列表中随机选择一个项目并将其删除,然后将其添加到第1列。

答案 3 :(得分:0)

您可以使用以下步骤: 1.创建一个数组。 2.将最小值填充到最大值。 3.对阵列进行操作。按顺序读取数组。

使用Fisher-Yates shuffle算法进行后缀