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

如何获得第N个随机“NextInt”值?

孙恩
2023-03-14
private static final long multiplier = 0x5DEECE66DL;
private static final long addend = 0xBL;
private static final long mask = (1L << 48) - 1;
protected int next(int bits) {
    long oldseed, nextseed;
    AtomicLong seed = this.seed;
    do {
        oldseed = seed.get();
        nextseed = (oldseed * multiplier + addend) & mask;
    } while (!seed.compareAndSet(oldseed, nextseed));
    return (int)(nextseed >>> (48 - bits));
}
nextseed = (oldseed * multiplier + addend) & mask;

共有1个答案

席烨
2023-03-14

您可以在o(log N)时间内完成此操作。从S(0)开始,如果我们暂时忽略模数(248),我们可以看到(使用MA作为乘法器加数的简写)

s(1) = s(0) * m + a
s(2) = s(1) * m + a = s(0) * m² + (m + 1) * a
s(3) = s(2) * m + a = s(0) * m³ + (m² + m + 1) * a
...
s(N) = s(0) * m^N + (m^(N-1) + ... + m + 1) * a

现在,m^N(mod2^48)可以通过模幂运算和重复平方,以o(logn)步长轻松地计算出来。

另一部分要复杂一点。暂时再忽略模数,几何和为

(m^N - 1) / (m - 1)

使计算这个模2^48变得有点不简单的是m-1不是模的互质。然而,由于

m = 0x5DEECE66DL

m-1和模的最大公约数是4,并且(m-1)/4有一个模逆inv2^48。让

c = (m^N - 1) (mod 4*2^48)
(c / 4) * inv ≡ (m^N - 1) / (m - 1) (mod 2^48)

所以

  • 计算m≡m^n(mod 2^50)
  • 计算投资

获得

s(N) ≡ s(0)*M + ((M - 1)/4)*inv*a (mod 2^48)
 类似资料:
  • 我必须找到每个数组元素的第N个nextInt。下面的代码真的很慢,因为数组元素超过40K,每个数组元素超过100万。 有没有更快的方法得到第100万个Nextint?如果是,请怎么做?

  • 我正在使用 azure cosmos DB 充当 MongoDB 版本 4.0.0.我需要使用蒙哥数据库 API 从 Azure Cosmos DB 获取 N 个随机文档。我尝试过使用$sample运算符,但每次我查询时,它都会以相同的顺序为我提供文档。 无论我运行这个查询多少次,我都会从集合中得到相同的文档。

  • 在L-4中,它很简单: 但现在在L-5中,这篇文章中描述的没有一种方法是有效的:Laravel-雄辩或流畅的随机行 我的视图文件变为空白。

  • 我想做一个模板,在那里我可以输入一个索引,它会给我在那个索引的类型。我知道我可以用来实现,但我想自己实现它。例如,我想这样做, ...它会给出位置的类型(因为数组是从0开始索引的)。我怎么能这么做?多谢了。

  • 问题内容: 我正在研究“如何从javascript中的数组随机访问元素”。我发现了许多与此有关的链接。 问题: 但是在这种情况下,我们只能从数组中选择一项,如果我们想要多个元素,那么我们将如何实现这一点,所以请仅从该语句中获取一个数组中的多个元素。 问题答案: 尝试以下无损快速功能:

  • 问题内容: 我不知道如何从条件实例中获取n个随机行: 那呢 我找不到使用Criteria API的任何文档 这是否意味着我应该改用HQL? 谢谢! 编辑:我通过以下方式获得行数: 如何获取索引介于0和max之间的n个随机行?再次感谢! 问题答案: 实际上,使用Criteria进行一些调整是可能的。方法如下: 任何Restrictions.sqlRestriction将添加关键字“和”;为了消除其影