- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
编辑: 这个问题已经解决了。如果您想帮助解决其他问题,请访问 Java Biasing Random Numbers in a Triangular Array .
我在玩乘法游戏,所以我选择了 0 到 12 之间的 2 个数字(含 0 和 12)。如果我这样做:
int num1 = (int)(Math.random() * 13);
int num2 = (int)(Math.random() * 13);
方 block (0x0、1x1、2x2 等)有一半时间被选中(因为 1x2 与 2x1 相同)。我怎样才能让所有的组合都以相同的频率被选中?有 91 种可能的组合 (n(n+1)/2)。如果有帮助,这是一个 13 x 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)),但我不知道该怎么做拆分它。
最佳答案
int roll = random.next(91)
策略可以正常工作。您将获得有保证的、无忧的均匀分布和更好的启动性能,因为您只选择了 1 个随机数。您只需要找到一个公式来标识一个“行”的结束位置和另一个“行”的开始位置。寻找模式:
0, 1, 3, 6, 10, 15, ...
它们被称为 "triangular numbers..." 是有原因的
让我们更充实一点。您实际上想要找到比您选择的随机 roll
最近的三角形编号更小:这会让您到达正确的行,以及该三角形编号与 roll
获取该行的偏移量。
鉴于 n
th 三角形数由 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++;
}
}
当然,那很无聊,也没多想。我们可以做得更好!无论输入有多大,我们都可以在常数*时间内完成!从 inverting the function 开始(当然,我们只关心正根):
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;
}
综合起来:
int roll = random.nextInt(91);
int num1 = (int) (Math.sqrt(8*roll + 1) - 1)/2;
int num2 = roll - num1*(num1+1)/2;
*假设 native StrictMath#sqrt(double)
函数是常数时间 - I'm actually not sure about this.
关于Java- Math.random() : Selecting an element of a 13 by 13 triangular array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15755228/
我发现很难提出问题,但我想找到一种聪明的方法(不使用循环)来获得以下结果: > my.vector = letters[1:6] > print(my.vector) [1] "a" "b" "c"
我如何转换这种类型: std::tuple 进入这个: std::tuple, std::function, std::function, ... std::function > 最佳
我很难在 SQL 中得到一个 - 看似简单 - 的权利。我正在使用 MS Access,但我想这并不重要。 我的数据结构如下所示: 所以tblA有“产品”,tblB “组件”和tblC “模块”。这显
我想要将一组子图分为三行,第一行有一个子图,第二行有两个,第三行有三个。我做了以下事情: fig, axes = plt.subplots(figsize=(10, 10), sharex=True,
我正在尝试创建悬停菜单。将其悬停在菜单项中会出现一个三 Angular 形。但是当我进入下拉菜单时,它就消失了。 .navbar-wrapper .col-lg-8 ul li a:hover{
这仅涉及多边形面(具有超过 4 条边的对象面).. 在 3DSMAX 中,.OBJ 有 3 种导出模式:三 Angular 形、四边形和多边形。我已经进行了多次测试,并使用两个可用的工作流程(使用 O
我正在尝试创建一个直 Angular 三棱柱。 到目前为止,这是我的代码: var triangleGeometry = new THREE.Geometry(); triangleGeometry.
我想运行一个模拟,该模拟使用下限 A、模式 B 和上限 C 的三角概率分布生成的值作为参数。如何在 Python 中生成该值?对于这个分布,是否有像 expovariate(lambda)(来自随机)
我正在尝试使用 DAC 和 DMA 生成频率为 8kHz 的三角波。使用定时器触发 DAC,以便 DAC 速度为 1 MSPS。我正在研究 stm32L476 发现板。我使用 stm32CUBEMX
Project Euler problem 18要求我们找到三角形网格中从上到下总和最大的路线。 我的程序应该能够接受如下所示的输入。测试用例的数量 (2) 出现在第一行,然后对于每个测试用例给出行数
这是 Codility 的三角问题: A zero-indexed array A consisting of N integers is given. A triplet (P, Q, R) is
我正在添加一个新函数,如果它是上三角形,则将 DataFrame 转换为下三角形,反之亦然。我使用的数据总是有前两行只用第一个索引填充。 我尝试使用这个问题的解决方案 Pandas: convert
编辑: 这个问题已经解决了。如果您想帮助解决其他问题,请访问 Java Biasing Random Numbers in a Triangular Array . 我在玩乘法游戏,所以我选择了 0
我主要使用 Armadillo 来处理对称矩阵和三角形矩阵。我希望在内存存储方面保持高效。然而,似乎没有其他方法,只能创建一个新的垫子并用零(对于三角形)或重复项(对于对称)填充矩阵的下/上部分。 是
我正在编写一些操纵 3D 三角形网格的代码。导入网格数据后,我需要“统一”空间中同一点的顶点。 我一直假设 numpy 数组是存储和操作数据的最快方式,但我似乎无法找到一种既能快速构建顶点列表又能避免
我是一名优秀的程序员,十分优秀!