当前位置: 首页 > 知识库问答 >
问题:

如何控制选择数字的概率?

钱经赋
2023-03-14

我正在构建一个游戏,我想在0n之间选择一个随机数,我想让选择一个更高的数字的几率更低。

所以我问了这个问题,根据amit的回答,我写了这样一句话:

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

输出我在10000次跑步中选择每个数字的次数。

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值是多少,我总是得到相同的输出。

我需要找到一种方法来修复这个算法,以便x将影响拾取两个不同值之间的机会比率,而主要思想将保持不变:拾取更高的值将更难。

共有1个答案

上官自明
2023-03-14

这样可以吗?如果你使用加法版本,你最终会得到相同的概率。我正在使用更新的乘法版本。

另外,使用x

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

 类似资料:
  • 我有一个k3s(v1.19.3 k3s3)集群,我正在使用“开箱即用”traefik入口控制器 我找不到如何使用helm图表(例如,这个幽灵图表)来使用这个入口控制器。在我对Helm图表如何工作以及它们实现的目的的理解中,模板允许使用不同的入口控制器。这是图表的 基于此,我会说我需要编辑的部分以使用traefik而不是默认 但是,无论我在中尝试什么,都会不断得到 就好像赫尔姆在寻找一个Nginx入

  • 选择控制器允许用户选择选项。有三种类型:复选框、单选框以及开/关切换。选择控制器使用主题同样的颜色。 复选框 单选按钮 切换开关 复选框 复选框允许用户从一个数据集中选择多个选项。 如果在一个列表中有多个选项,你可以通过使用复选框而不是开/关切换来节省空间。 如果你有一个单选项,不要用复选框,使用开/关切换。 白色主题 黑色主题 白色 开: Swatch 500, 透明度 100% 关: #000

  • 问题内容: 我是Linux的新手。有没有办法查看gedit中的控制字符。我去了options-> preferences,我得到的就是查看文本文件行号的选项。是否需要安装任何插件才能看到相同的插件?我在Ubuntu 12.04 LTS上,其gedit版本为3.4.1。 问题答案: 有一个适用于Ubuntu 的 gedit-plugins 软件包。安装它,然后查看gedit首选项中的 Draw Sp

  • 本文向大家介绍JS控制TreeView的结点选择,包括了JS控制TreeView的结点选择的使用技巧和注意事项,需要的朋友参考一下 网上有很多控制TreeView的checkbox选中,但是自己尝试的时候,要么报错,要么不可行。以下这种写法是经过验证有效的,仅作参考,思维比较巧妙! Tree: 脚本: 这个脚本的写法巧妙运用生成的页面源文件中checkbox与其子结点div之间的关系! 那么,只需

  • 问题内容: 我使用的选择标记的格式允许多次选择,但我希望选择的最大数量为10。使用JavaScript或jquery是否可以? 提前致谢! 问题答案: 这是供您使用的一些完整代码…一定要喜欢Google AJAX API Playground :-) 编辑1: 注意:这只允许您选择5,因为我不想复制/粘贴另外10个选项:-) ​

  • 我在宣传单上展示了两个Geojson文件。这两个文件在我的地图上显示良好,但我希望能够有选择器工作在两个层。 如您在这里所见,我选择器仅显示在以下省份:http://bl.ocks.org/renauld94/8493CA671CE8DE63BFAB9FAFD3F3F574/363F40907203CC431DE22E16987669B7BAE13FE8 我如何可以有一个选择器为两层?