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

Java-Math.random():选择13×13三角形数组中的一个元素

南门鸿哲
2023-03-14

编辑:这个问题解决了。如果您想在另一个问题上提供帮助,请访问Java偏置三角形数组中的随机数。

我在做一个乘法游戏,所以我选了两个0到12之间的数字。如果我这样做:

int num1 = (int)(Math.random() * 13);
int num2 = (int)(Math.random() * 13);

正方形(0x0、1x1、2x2等)的拾取时间为一半(因为1x2与2x1相同)。如何使所有组合以相同的频率拾取?有91种可能的组合(n(n1)/2)。如果有帮助的话,这里有一个13乘13的三角形阵列:

{{0},
 {0,0},
 {0,0,0},
 {0,0,0,0},
 {0,0,0,0,0},
 {0,0,0,0,0,0},
 {0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0}};

我试着选择第一个数字,然后给第二个数字50%的机会成为第一个。这不起作用。我试着给第二个数字1/91的机会成为第一个。这导致较小的数字被选中的次数要多得多(大约7/91的时间;这是一个平滑、弯曲的增加)。我想过有一个随机数:int roll=random.next(91),然后将其拆分为2个条目(如坐标(x, y)),但我不知道如何拆分它。

共有1个答案

韦熙云
2023-03-14

int roll=random.next(91)策略会很好地工作。您可以获得有保证的、无忧的均匀分布和更好的启动性能,因为您只选择1个随机数。您只需要找到一个公式来识别一个“行”的结束位置和另一个“行”的开始位置。寻找模式:

0, 1, 3, 6, 10, 15, ...

它们被称为“三角形数”是有原因的

让我们再充实一点。您实际上想要找到比您选择的随机roll更小的最近三角形数:这将使您到达正确的行,并且该三角形数和roll的差值将使您获得该行的偏移量。

给定nth三角形数由n*(n 1)/2给出,如何找到比roll小的最大的一个?鉴于数组的小尺寸,一个简单的实现应该很快:

int largestTriangleNumberSmallerThan(int x) {
    int i = 0;
    int last = 0;
    while (true) {
        int triangle = i*(i+1)/2;
        if (triangle > x) return last;
        last = triangle;
        i++;
    }
}

http://ideone.com/vzQEBz

当然,这很无聊,而且没有考虑任何问题。我们可以做得更好!无论输入量有多大,我们都可以在恒定的时间内完成!首先反转函数(当然,我们只关心正根):

n = (Math.sqrt(8y + 1) - 1)/2

然后截断小数部分,并重新运行:

int largestTriangleNumberSmallerThan(int x) {
    int n = (int) (Math.sqrt(8*x + 1) - 1)/2;
    return n*(n+1)/2;
}

http://ideone.com/1qBHfX

总而言之:

int roll = random.nextInt(91);
int num1 = (int) (Math.sqrt(8*roll + 1) - 1)/2;
int num2 = roll - num1*(num1+1)/2;

就这样!

*假设本机StrictMath#sqrt(Double)函数是常量时间-我实际上不确定这一点。

 类似资料:
  • 问题内容: 我正在尝试制作一个程序,该程序需要用户输入诸如三角形应该多长时间及其方向。我的问题是,在我运行该程序后,它会继续向程序中添加更多的数字。 例如 我的代码: 问题答案: 你有。对于while循环的每个循环,这将继续将输入添加到变量中。您可能想要的只是。 要使其在每次迭代中再次打印出您的第一个提示,只需将您的调用放入while循环内即可。(它也必须先出现,以便 在 输入输入 之前 显示提示

  • 问题内容: 嗨,我正在尝试创建仿射变换,使我可以将一个三角形变换为另一个三角形。我所拥有的是2个三角形的坐标。你能帮助我吗? 按照亚当·罗森菲尔德的回答,我想出了这段代码,以防万一有人无聊地自己解决方程: 问题答案: 我假设您在这里谈论2D。仿射变换矩阵中有9个值: 有3个顶点输入,和,当其转化应该成为,,。然而,由于我们在齐次坐标的工作,应用到不一定给-它给人的倍数。所以,我们也有未知的乘法器,

  • 这个问题是Java-Math.random()的扩展:选择13×13三角形数组的元素。我随机选择两个数字(包括 0-12),我希望这些值相等。 但现在,由于这是一个乘法游戏,我希望有一种方法来偏置结果,以便某些组合出现得更频繁(比如,如果玩家在12x8时表现得更差,我希望它出现得更频密)。最终,我想偏向于91种组合中的任何一种,但一旦我把这一点写下来,那就不难了。 我的想法:添加一些到三角形数和以

  • 问题内容: 假设我有一个数组,我想随机选择一个元素。 最简单的方法是什么? 明显的方法是。但是也许有红宝石之类的东西?或者如果不能通过扩展创建这种方法? 问题答案: Swift 4.2及更高版本 推荐的新方法是Collection协议的内置方法:。它返回一个可选参数以避免我以前假设的空情况。 如果不创建数组并且不能保证count> 0,则应执行以下操作: Swift 4.1及以下 只是为了回答您的

  • 假设我有一个数组,我想随机选择一个元素。 最简单的方法是什么? 最明显的方法是数组[随机索引]。但可能有类似ruby的数组。示例 ?或者,如果不是,那么可以使用扩展创建这样的方法吗?

  • 对于我的Android项目,我想为我的集成测试运行一个测试HTTP服务器。我创建了一个配置并编写了一个任务来运行我的Groovy脚本来设置HTTP服务器 当我编辑Groovy脚本时,IntelliJ告诉我Groovy SDK尚未配置。 我如何让IntelliJ使用Groovy SDK,它是stubs配置的一部分?我无法使用Gradle获取的库创建Groovy SDK配置,因为IntelliJ告诉我