根据该位置的值随机选择矩阵中的位置

时间:2016-02-22 17:03:35

标签: java matrix random

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

  

randomGenerator((F×10)+(F / 2))+ 1

RandomGenerator是Java.util.Random类

中的随机数生成器

我想从矩阵中随机选择一个位置,如[2; 6],并向用户显示输出,但我希望随机性取决于位置的值。如果值更高,那么它被挑选出来的机会也是如此。现在它只显示一个随机位置。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

解决这个问题的标准方法是:

  1. 从原始矩阵计算标准化矩阵
  2. 0生成价值1
  3. 扫描标准化矩阵,汇总值,当前运行总和超过先前生成的数字时,停止搜索 - 您找到了您的位置
  4. 规范化矩阵的计算:

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

      原始数组:

      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;
      }
      

      结果是:

      #0  1283    12.83%
      #1  3732    37.32%
      #2  4985    49.85%
      

答案 1 :(得分:1)

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

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

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的值。您可以使用任何有价值的函数。

答案 2 :(得分:0)

这可能对您有所帮助: http://introcs.cs.princeton.edu/java/95linear/Matrix.java.html

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

(假设您正在使用矩阵类)