问题标签 [prng]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
191 浏览

prng - 两个 PRNG 可以用不同的种子产生相同的数字吗?

我知道如果您将相同的种子与两个不同的 PRNG 一起使用,您将收到相同的数字序列。有谁知道是否可以用两个不同的种子生成相同的数字?如果是这样,几率是多少?

我对此进行了测试并收到了一些奇怪的结果。如果我有两个相同 PRNG 的实例,并且每次都用两个不同的随机种子播种它们。随机数必须在 0 到 1000 之间。在 10,000,000 次迭代后,我得到相同的数字 1046 次。如果我每次都没有播种它们,我会收到大约相同的次数(1033)。我不明白什么?如果您不每次都重新播种,我认为几率会更大(嗯,也许不是)。就像从两副牌中挑选两张牌一样。如果我不每次都洗牌,我会认为如果我这样做,几率会有所不同。

谢谢,加里

0 投票
4 回答
3891 浏览

algorithm - Perlin/Simplex Noise 算法的随机性质量如何?

Perlin 噪声算法和 Simplex 噪声算法的随机性质量如何?

两者哪个算法的随机性更好?

与标准的伪随机生成器相比,使用 Perlin/Simplex 作为随机数生成器有意义吗?

更新:我知道 Perlin/Simplex Noise 的用途。我只是对随机性感到好奇。

0 投票
2 回答
235 浏览

algorithm - 依赖于参数的 PRNG

我对rand(x, y, seed)基于其参数返回(伪)随机数的函数感兴趣,该函数具有以下属性:

  1. 返回的值应该取决于它的 3 个参数,而不是取决于rand到目前为止被调用的次数。例如,假设这些调用,按以下顺序:

    然后rand用相同的参数调用,但顺序不同,我们应该得到相同的值。例如:

  2. 该函数应该具有良好的通常属性(体面,我真的不需要任何非常花哨的东西)PRNG:大周期,均匀分布等。返回适合有符号整数的正整数很好。如果你愿意,它也可以更高。

  3. 假设这些数字将用于生成矩阵。然后更改种子应确保生成的矩阵看起来与其他种子生成的矩阵尽可能不同。这应该发生在尽可能多的种子上:我不希望矩阵重复。

如果有帮助,我的种子将始终是以毫秒为单位的 unix 时间戳(如果这以某种方式使其更容易,也可以以秒为单位)。所有参数都可以高达 32 位有符号整数,但在函数内部使用 64 位值不是问题。

我可以为此使用什么功能?

我想到的:

Perlin 噪声似乎做了我想做的一些事情,但我不知道它作为 PRNG 到底有多合适,尤其是在分布方面。我也不确定它的效率如何,因为我的(x, y)参数将是相当随机的,我无法为所有参数预先计算它。

我还研究了以下功能:

似乎产生了足够好的数字。根据我的(非常弱的)测试,它们似乎也分布得很好。测试这个时期虽然更难,但我没有这样做。

更新:

这是上述函数的Enttime(NULL)的输出,其中in C 作为它的种子和为 生成的值(x, y) in {0 ... 999} x {0 ... 999}

熵 = 每字节 3.312850 位。

最佳压缩将使这个 9207076 字节文件的大小减少 58%。

9207076 个样本的卡方分布为 229710872.43,并且随机超过该值的次数不到 0.01%。

数据字节的算术平均值为 52.3354(127.5 = 随机)。Pi 的 Monte Carlo 值为 4.000000000(误差 27.32%)。序列相关系数为 0.036131(完全不相关 = 0.0)。

这在实践中是否足够好(理论上,上述测试表明它根本不好),还是我应该使用一些众所周知的东西?

0 投票
1 回答
3988 浏览

c# - 在 Int32 或 UInt32 中散列位的好方法是什么?

我有一个伪随机数生成器的实现,特别是 George Marsaglia 的 XOR-Shift RNG。我的实现在这里:

FastRandom.cs

事实证明,第一个随机样本与种子非常密切相关,如果您看一下 Reinitialise(int seed) 方法,这一点相当明显。这是不好的。我提出的解决方案是将种子的部分混合如下:

因此,我通过将种子的位与四个素数相乘并异或返回形成_x,大大削弱了任何相关性。我还在乘法之前旋转种子的位,以确保不同大小的位在 32 位值的整个值范围内混合。

四向轮换似乎在什么都不做和所有可能的轮换之间取得了很好的平衡(32)。素数是“空中的手指”——足够大的量级和位结构来混淆这些位并将它们“传播”到完整的 32 位上,而不管起始种子如何。

我应该使用更大的素数吗?是否有解决这个问题的标准方法,也许有更正式的基础?我试图以最小的 CPU 开销来做到这一点。

谢谢

=== 更新 ===

我决定使用一些素数,其设置位更好地分布在所有 32 位上。结果是我可以省略移位,因为乘法可以达到相同的效果(在 32 位的整个范围内散列位),所以我只需将四个乘积相加即可得到最终的种子......

我可能会用更少的素数/乘法来逃脱。两个似乎太少了(我仍然可以在第一个样本中看到模式),三个看起来还不错,所以为了安全起见,我把它变成了四个。

=== 更新 2 ===

仅供参考,上述简化为功能等效:

我最初没有发现这一点,当我发现时,我想知道在计算的不同阶段溢出是否会导致不同的结果。我相信答案是否定的——这两种计算总是给出相同的答案。

0 投票
3 回答
8067 浏览

java - 将 SecureRandom 与 SHA-256 一起使用

我一直在使用带有种子 SHA1PRNG 算法的 SecureRandom 在两个进程之间创建共享随机性。我最近了解到,根据 NIST 的标准,SHA1 已被弃用,因此我们正在努力切换到 SHA256。我发现的问题是 SecureRandom 仅支持 SHA1PRNG,至少根据Oracle 的文档。我想知道是否有办法将 SecureRandom 与 SHA256 一起使用,或者可能更好,什么是使用 SecureRandom 的合适替代方案?

0 投票
5 回答
37586 浏览

glsl - 这个 GLSL rand() 单线的起源是什么?

我已经看到这个伪随机数生成器在网络上到处引用的着色器中使用:

它被称为“规范”或“我在网上某处找到的单行”。

这个函数的起源是什么?常数值是否像它们看起来那样随意,或者它们的选择有什么艺术?有没有讨论这个功能的优点?

编辑:我遇到的对这个函数的最古老的引用是这个 08 年 2 月的档案,原来的页面现在已经从网上消失了。但是那里没有比其他任何地方更多的讨论。

0 投票
1 回答
1237 浏览

c# - 为什么我对随机数生成器执行停车场测试会产生不好的结果?

我正在尝试为随机数生成器编写停车场测试的实现。以下是我从中获取有关测试信息的来源:英特尔数学库文档本文的第 4 页以及此处列出的概率密度的 phi 函数。

我用 C# 编写了测试的实现。它使用一个 100x100 的网格,其值最初设置为 null。然后我使用随机数生成器为 x 和 y 生成随机整数。如果网格的该索引及其邻居为空,则该索引设置为 1。否则,不会发生任何事情,因为发生了“崩溃”。

我使用 C# System.Random 生成器运行它。我不相信结果是正确的,因为我总是得到非常接近 3079 点的停车点,这比我应该得到的平均值少了大约 500 点。它还产生 2.21829146215425E-90 的 p 值。

我的代码如下。有没有人有这方面的经验,或者任何人都可以看到我在实施中可能做错了什么?任何帮助将不胜感激。

编辑 - 我原来的实现的问题是

  • 我正在绘制正方形而不是圆盘
  • 我只在整数值处绘制点。我应该改用十进制值。
  • 由于上述两个,我需要更改我的距离检查

感谢 Chris Sinclair 和 mine z 帮助解决这个问题。最终代码发布在下面。

0 投票
2 回答
2375 浏览

montecarlo - .net 中用于蒙特卡罗模拟的可靠且快速的伪随机数生成器 (PRNG)

我使用伪随机数生成器 (PRNG) 来蒙特卡罗模拟排队类型的系统。我使用 System.Random,因为它很快,但发现它在随后的抽奖之间有一些奇怪的相关性,这会干扰结果(它不够随机)。

现在我正在使用 Mersenne Twister (http://takel.jp/mt/MersenneTwister.cs),它(到目前为止)已被证明对于我的目的来说足够随机。它慢了 50%,但这是我愿意为获得可靠结果而付出的代价。

.net 的什么 PRNG 最适合蒙特卡洛模拟?我正在寻找一个不太慢的可靠 PRNG。

0 投票
1 回答
224 浏览

c++ - 使用 Boost 随机基础设施,但如何轻松替换组件(比如底层生成器)?

例如,我的用例是课堂使用。

Boost random 基础设施已经存在,我试图避免 NIH 综合症。但是比方说,我想

1-研究各种 PRNG 的属性(好的,比如说缺陷)及其对生成正态(或其他分布)变量的影响。如何做到这一点并且仍然保留生成一大堆分布的其他 Boost 功能?

2-使用 Boot(比如 Mersenne Twister)生成器并测试生成其他分布的各种方法(比如正常的分布)。

是否有一种简单而通用的方法可以直接替换任何 Boost 随机基础设施组件,并且仍然能够使用其余部分?

0 投票
3 回答
1753 浏览

python - 如何用某种“动量”生成随机方向(N、S、E、W、无)?

我正在尝试以随机方式探索网格。
我可以去的五个可能的方向是北、东、南、西和停留,所有这些都是同样可能的,至少在最初是这样。

从上面简单地选择一个随机方向的问题在于它最终使我的代理离中心太近(两个随机方向很容易相互抵消),这完全违背了随机游走的目的。

想做的是以随机方式生成随机方向,整体上是无偏的,但更有可能选择接近先前选择的方向的方向

换句话说,我需要我的 RNG 有某种“动力”。

我想出了这个算法:

这似乎给出了很好的结果:

...除了虽然该算法保证正数和负数的可能性相同,但它不能保证从 -1 到 +1 的区间内均匀分布!

(如果您意识到数字不一定以 -1 和 +1 为界,这应该很明显!)

所以我的问题是,我如何将这个(或其他算法)扩展到选择五个方向之一,而不仅仅是一个正数或负数?