Java 根据位置值从矩阵中随机选择位置

Java 根据位置值从矩阵中随机选择位置,java,matrix,random,Java,Matrix,Random,我有一个XxY矩阵(所以它是2D),填充了基于这个公式的值,现在f是200: 随机发生器((f*10)+(f/2))+1 RandomGenerator是Java.util.random类中的随机数生成器 我想从矩阵中随机选取一个位置,如[2;6],并向用户显示输出,但我希望随机性取决于位置的值。如果该值较高,则其被拾取以显示的机会也较高。现在它只是显示一个随机位置 我如何才能做到这一点?这可能会对您有所帮助: 这显示了矩阵是如何创建的,可以帮助您确定随机选择正方形的方法 (假设您使用的是ma

我有一个XxY矩阵(所以它是2D),填充了基于这个公式的值,现在f是200:

随机发生器((f*10)+(f/2))+1

RandomGenerator是Java.util.random类中的随机数生成器

我想从矩阵中随机选取一个位置,如[2;6],并向用户显示输出,但我希望随机性取决于位置的值。如果该值较高,则其被拾取以显示的机会也较高。现在它只是显示一个随机位置


我如何才能做到这一点?

这可能会对您有所帮助:

这显示了矩阵是如何创建的,可以帮助您确定随机选择正方形的方法


(假设您使用的是matrix类)

解决此问题的标准方法是:

  • 从原始矩阵计算归一化矩阵
  • 0
    1
  • 扫描标准化矩阵,总结值,当当前运行的总和超过先前生成的数字时,停止搜索-您找到了您的位置
  • 计算归一化矩阵:

  • 汇总原始矩阵中的所有值
  • 填充新矩阵,其中每个元素=原始元素/所有元素之和
  • 简化示例:

    原始阵列:

    2 6 8
    
    归一化矩阵:

    0.125 0.375 0.5
    
    因此,通过生成随机值
    [0-1]
    您将选择

    position `0` 12.5% of time
    position `1` 37.5% of time
    position `2` 50% of time
    
    下面是同一个应用程序,它显示了该示例的工作原理:

    public static void main(final String[] args) {
        final double[] original = new double[] { 2.0, 6.0, 8.0 };
        final double[] normalized = getNormalized(original);
    
        final int[] positionPicked = new int[original.length];
        final Random rnd = new Random();
        for (int i = 0; i < 10000; i++) {
            final double d = rnd.nextDouble();
            final int position = getPosition(normalized, d);
            positionPicked[position]++;
        }
    
        for (final int p : positionPicked)
            System.out.println(p);
    }
    
    static double[] getNormalized(final double[] original) {
        double s = 0.0;
        for (final double e : original)
            s += e;
        final double[] normalized = new double[original.length];
        for (int i = 0; i < original.length; i++)
            normalized[i] = original[i] / s;
        return normalized;
    }
    
    static int getPosition(final double[] normalized, final double v) {
        double s = 0;
        for (int i = 0; i < normalized.length; i++) {
            s += normalized[i];
            if (s >= v)
                return i;
        }
        return normalized.length - 1;
    }
    

    让我们假设你有一个数字列表。您可以计算列表和二维矩阵之间的转换

    让我们假设选取一个元素的概率是成比例的。 你有这个矩阵

    482  
    759  
    123   
    
    您可以找到一种迭代制作列表的方法,例如
    4,8,2,7,5,9,1,2,3

    迭代生成累积和时
    4、12、14、21、26、35、36、38、41

    然后在sum*rand()范围内选择一个数字,这里是0-41

    累积和中大于随机数的第一项是您选择的单元格


    如果你想成反比,那就做1/x值的累积和。你可以这样使用任何有值函数。

    我没有使用我使用的矩阵类
    field=new int[x][y]
    我认为这不会是随机的。它总是会上升到最高值,如果我不这样做,它就会停止mistake@BRHSM这将是随机的,它将在最高值之前停止让我测试一下BRBOkey,所以我得到了你,直到你开始用0-1做事情。你能再解释一下吗?在你的最后一步中,我如何使用1-0来获得选择该位置的机会,以及我如何在代码中写出你在矩阵中的数字范围是多少?0到100?按照现在的测试,它的范围是1到2100,f是200位,可能会上升。我不想要这个值。我想要它现在的位置。该值仅与被拾取的机会相似
    482  
    759  
    123