问题描述
我建立一个游戏,我想选择的 0
随机数 N
,我想作出这样的选择一个较高的数量将有更低的机会。
I am building a game, I want to pick a random number between 0
to n
, I want to make that picking a higher number will have lower chances.
于是我问this的问题,并根据阿米特答案,我写这样的:
So I asked this question, and based on amit answer, I wrote this:
public class Test {
private static Random random = new Random();
public static void main(String[] ars) {
int n = 30;
float x = 5f;
int[] results = new int[n];
for (float i = 1; i <= 10000; i++) {
int choose = pickANumber(n, x);
results[choose]++;
}
for (int i = 0; i < results.length; i++) {
System.out.println(i + "\t" + results[i]);
}
}
static int pickANumber(int n, float x) {
ArrayList<Float> values = new ArrayList<>();
n += 2;
for (float i = 2; i < n; i++) {
float value = i * (i - 1) / (2f * x);
values.add(value);
}
float max = ((n - 1) * (n - 2) / (2 * x));
return pickANumber(max, values);
}
static int pickANumber(float max, ArrayList<Float> values) {
float number = random.nextFloat() * max;
int i = Collections.binarySearch(values, number);
if (i < 0) {
i = i * -1 - 1;
}
return i;
}
}
我有多少时间采摘每个数字10,000运行的输出。
Output of how many time I picked each number with 10,000 runs.
0 22
1 47
2 59
3 95
4 109
5 142
6 127
7 175
8 188
9 224
10 243
11 249
12 270
13 268
14 340
15 356
16 362
17 345
18 444
19 430
20 469
21 479
22 495
23 493
24 522
25 583
26 587
27 597
28 648
29 632
现在的问题是,它并没有关系 X
让我选择,我总是得到相同的输出。
The problem is that it does not matter what value of x
I choose, I always get the same output.
我需要找到一个方法来解决这个算法,以便 X
会影响捡了两个不同的值之间的机会的比例,而主要思路仍将:拾较高的值将变得更加困难。
I need to find a way to fix this algorithm so x
will affect the ratio of chances between picking up two different values, while the main idea will remain: Picking up higher values will be harder.
推荐答案
这将是好吗?如果您使用的添加剂的版本,你最终会具有相同的概率始终。我使用了更新的乘法的版本。
Would this be ok? If you use the additive version, you'll end up having the same probabilities always. I'm using the updated multiplicative version.
此外,使用 X'。1
获取更高价值的机会较低。而 X&GT; 1 ,否则
Also, use x<1
for lower chance of getting higher values. And x>1
otherwise.
import java.util.Arrays;
import java.util.Random;
public class Main {
private static Random random = new Random();
public static void main(String[] ars) {
int n = 30;
double x = 0.9;
double[] aux = makeAux(n, x);
int[] results = new int[n];
for (float i = 1; i <= 10000; i++) {
results[pickANumber(aux)]++;
}
for (int i = 0; i < results.length; i++) {
System.out.println(i + "\t" + results[i]);
}
}
static double[] makeAux(int n, double x) {
double[] aux = new double[n];
aux[0] = x;
for (int i = 1; i < n; i++)
aux[i] = aux[i - 1] + Math.pow(x, (i + 1));
return aux;
}
static int pickANumber(double[] aux) {
double number = random.nextDouble() * aux[aux.length - 1];
int i = Arrays.binarySearch(aux, number);
if (i < 0)
i = -i - 1;
return i;
}
}
这篇关于如何控制采摘数的概率是多少?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!