问题标签 [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 投票
8 回答
2381 浏览

php - 在 Web 应用程序中收集熵以创建(更多)安全随机数

经过几天的研究和讨论,我想出了这种从访问者那里收集熵的方法(你可以在这里查看我的研究历史)

当用户访问我运行此代码:

注意:胡椒是手动设置的每个站点/设置的随机字符串。

然后我执行以下(My)SQL 查询:

这意味着我们将访问者请求的熵与其他人已经收集的熵结合起来。

就这样。

然后当我们想要生成随机数时,我们将收集到的熵与输出相结合:

注意:最后一行是 phpseclib 的 crypt_rand 函数的修改版本的一部分

请告诉我您对该方案的看法以及有关熵收集/随机数生成的其他想法/信息。

ps:我知道像 /dev/urandom 这样的随机源。这个系统只是一个辅助系统或(当我们没有(访问)这些资源时)一个后备方案。

0 投票
1 回答
860 浏览

c# - 简单的方法调用真的很慢吗?

编辑:我已经解决了我的问题。原因是测试过程中的一个错误,一旦我被允许回答我自己的问题,就会详细说明。

我知道通常应该避免这种类型的问题,但是我遇到了一个我无法理解的非常奇怪的情况。我一直在尝试实现 PRNG,并且一直在针对 System.Random 测试它的性能。我发现我的代码慢了约 50 倍,但问题不是算法,而只是调用方法。即使我只是返回一个常数,它仍然会慢很多倍。

所以我写了一个简单的测试程序,比较调用一个包装了random.NextDouble()的方法,一个返回-1的方法,和直接调用random.NextDouble()。我在 Ideone 中进行了测试,它给出了预期的结果;所有的时间都是相似的,返回一个常数是最快的。时间都在0.1秒左右。

但是,在 Visual Studio 2011 Beta 或 2010 C# Express 中编译的相同代码将分别导致每种情况下的 4 秒、4 秒和 0.1 秒。我肯定是在发布模式下运行,优化代码复选框被勾选,从 Visual Studio 外部启动会得到相同的结果。那么为什么在 Visual Studio 中如此简单的方法调用比 Ideone 慢得多?这是我用来基准测试的代码:

0 投票
1 回答
14386 浏览

assembly - 汇编语言随机数生成器

我最近开始学习汇编语言。对于我正在从事的项目,我必须使用线性同余制作一个随机数生成器。我想取三个数字。一个上限、一个下限和我想要多少个随机数。至于我想出的获取随机数的公式......

randomNumber = (seed % (upper-lower) + lower)

然后我尝试将其放入代码中。我想出了这个

我很好奇如何在每个循环周期结束时打印出随机数。如果上面的代码有意义。

提前致谢!

0 投票
4 回答
14683 浏览

c# - 等概率范围内的随机数

这可能比 C# 更与数学相关,但我需要一个 C# 解决方案,所以我把它放在这里。

我的问题是关于随机数生成器的概率,更具体地说,是否以相等的概率返回每个可能的值。

我知道有Random.Next(int, int)方法返回第一个整数和最后一个整数之间的一个数字(最后一个是排他的)。

Random.Next()[无重载] 将返回一个介于 0 和 Int32.MaxValue(即 2147483647)之间的值 - 1,即 2147483646。

如果我想要一个 1 到 10 之间的值,我可以调用Random.Next(1, 11)来执行此操作,但是 1 到 10 之间的每个值是否具有相同的发生概率?

例如,范围是 10,所以 2147483646 不能完全被 10 整除,所以值 1-6 出现的概率略高(因为2147483646 % 10 = 6)。这当然是假设Random.Next()[没有重载] 中的每个值都以相等的概率返回 0 到 2147483646 之间的值。

如何确保一个范围内的每个数字都有相同的出现概率?假设对于彩票类型系统,某些人比其他人拥有更高的概率是不公平的,我并不是说我会为此使用 RNG 中内置的 C#,我只是将其用作示例。

0 投票
2 回答
2696 浏览

php - 使用 PHP 的 mt_rand() 生成哈希盐的安全性?

我正在尝试生成河豚哈希,我想知道依靠mt_rand()为我生成盐是否足够安全?

上面的字符 $seed 是允许的 64 个字符的河豚盐字母表。我打算用它来生成和比较密码。

编辑

我从来没有意识到这一点,但@zerkms 说的是真的。盐只是为了防止可重用的预计算攻击,因为盐在他们可以访问散列的同一点上是已知的。所以目标不是一种不可逆的盐——它是一种随机的盐。

那么,这有什么问题吗?

此外,如标题和上面的代码中所述,我没有实现自己的哈希算法。

更新 2

如果加载,使用 mcrypt 扩展会导致以下结果,这实际上更快可能是因为uniqid(u)sleeps 或其他原因。

更新 3

base64_encode 比 md5 快 - 但它包含无效的河豚字符,如+. 所以现在改成md5。

0 投票
4 回答
586 浏览

random - 真正的随机数发生器

据我了解,PRNG 使用的种子会生成一系列并非真正随机的数字。是否有可能通过每次使用不同的种子一遍又一遍地重用 PRNG 来创建一个真正的随机数生成器。种子可以从开发/随机或当前时间或时钟滴答中提取。如果没有,那么是否有一个真正的随机数生成器在软件中实现?

谢谢

0 投票
3 回答
310 浏览

java - 带有某些种子的随机数似乎仍然是随机的

我有一个程序,它大量使用随机数来决定它需要做什么,并且有许多基于 PRNG 输出的执行路径。在尝试调试它之后,我决定让所有 PRNG 调用都引用同一个 Random 实例,该实例在实例化时已被植入一个硬编码数字。这样,每次我运行程序时,都会出现相同的错误。不幸的是,每次运行它时我仍然会遇到不同的错误(尽管它的行为似乎几乎相同)。

我已经多次搜索代码以查找对 Math.random() 的任何未接来电,我向您保证没有。

有任何想法吗?

编辑:我已经确认生成的数字是相同的,但行为仍然是不确定的。这个程序不是多线程的。还是完全糊涂了。

所以 PRNG 的行为符合预期,但我仍然有不确定性。有哪些方式可能会无意中将非确定性带入程序中?

0 投票
5 回答
2259 浏览

random - 如何从 xy 坐标生成种子

我一直在研究 perlin 脚本,但在创建简单的伪随机值时遇到了问题。

我需要能够从 xy 坐标创建种子值,但 x+y 在重复值方面存在明显问题。他们也进入负空间,所以 x^y 不起作用。

抱歉,如果这已经在其他地方得到了回答,但我不明白或找不到。

0 投票
1 回答
112 浏览

random - 组合随机生成器的不同实例,但仍保持低差异

我正在生成大约 1 亿个随机数来从 300 件事情中挑选。我需要设置它,以便我有 1000 万个独立实例(不同的种子),每个实例选择 10 次。目标是使汇总结果具有非常低的差异,例如,每个项目被选中的次数大致相同。

问题在于常规 prng,某些数字比其他数字更容易选择。(尝试了lcg和mersenne twister)最多和最少的差异可能是几千到一万)使用线性一致性生成器和mersenne twister,我也尝试用1个实例选择1亿次,也没有产生统一的结果。我猜这是因为周期很长,可能一亿还不够大。从理论上讲,如果我选择足够多的数字,结果应该会达到一致。(应按预期值结算)

我改用了准随机生成器 Sobol,并通过 1 实例测试中的 1 亿得到了更好的结果。(最多选择和最少选择之间的差异约为 5)但是将它们分成 1000 万个实例,每个实例 10 次,失去了一致性,我得到了与 prng 相似的结果。Sobol 似乎对序列非常敏感——随机向前跳过会降低一致性。

是否有一类随机生成器即使在组合 1000 万个独立实例时也能保持类随机的低差异?还是理论上不可能?我现在能想到的一种解决方案是使用 1 个 Sobol 生成器,它在 1000 万个实例之间共享,因此它实际上与 1 个实例测试中的 1 亿个相同。

0 投票
0 回答
86 浏览

c# - 基于种子值和输出的重构函数

我有一个用 C# 重写的程序。有一个函数我没有我想在重写时重新创建的代码。根据我的调查,我认为它是某种 RNG。

我已经隔离了函数的种子值和输出。它在程序启动时生成一个无符号整数(种子),然后基于该种子生成一个 256 uint 数组。该程序使用数组中的值,一旦程序到达数组的末尾,种子就会增加 1,并且数组的输出会发生变化。

我已经尝试过:我已经使用我能找到的所有流行(?)RNG/PRNG 方法(mersenne twister、xor32 等)的算法设置了测试。我想他们可能在创建函数时使用了其中之一,但未能重现输出。

我的问题是,如果我有输出和种子,有没有办法重现产生这个输出的函数?如果可能的话,我想重新创建它。