我有一个XxY矩阵(所以它的2D)填充了基于这个公式的值,f现在是200:
randomGenerator((F×10)+(F / 2))+ 1
RandomGenerator是Java.util.Random类
中的随机数生成器我想从矩阵中随机选择一个位置,如[2; 6],并向用户显示输出,但我希望随机性取决于位置的值。如果值更高,那么它被挑选出来的机会也是如此。现在它只显示一个随机位置。
我怎样才能做到这一点?
答案 0 :(得分:1)
解决这个问题的标准方法是:
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;
}
结果是:
#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
这显示了矩阵的创建方式,可以帮助您确定随机选择正方形的方法。
(假设您正在使用矩阵类)