问题标签 [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.
math - c=2^N +-1 快速计算 (a*b) mod c
在 32 位整数数学中,加法和乘法的基本数学运算是隐式计算的,模 2^32,这意味着您的结果将是加法或乘法的最低位。
如果你想用不同的模数计算结果,你当然可以使用不同语言的任意数量的 BigInt 类。对于 a,b,c < 2^32 的值,您可以计算 64 位长整数的中间值,并使用内置的 % 运算符来减少到正确的答案
但是有人告诉我,当 C 的形式为 (2^N)-1 或 (2^N)+1,不使用 64 位数学或一个 BigInt 库,并且非常有效,比任意模计算更有效,并且还可以正确计算如果包含中间乘法,通常会溢出 32 位 int 的情况。
不幸的是,尽管听说这种特殊情况有快速评估方法,但我实际上并没有找到该方法的描述。“那不是在 Knuth 吗?” “这不是维基百科的某个地方吗?” 是我听到的喃喃自语。
这显然是随机数生成器中的一种常用技术,因为 2147483647 是一个等于 2^31 -1 的素数,所以它对 a*b mod 2147483647 进行乘法运算。
所以我会问专家。这个我找不到任何讨论的聪明的特殊情况乘法与mod方法是什么?
random - 是否存在用于根据用户输入构建熵池的软件?
出于某些目的,能够绕过任何类型的算法生成的随机数以支持自然输入(例如掷骰子)会很好。例如,加密密钥生成让我觉得需要足够少的随机数据,并且数据真正随机的要求足够高,这可能是一个可行且理想的事情。
所以在我动手之前我想知道的是:是否有任何软件可以直接从随机数字输入构建熵池?请注意,仅仅将事物从基数 r 转换为基数 2 是不够的;例如,因为 3 和 2 是相对素数,所以将基数 3(或基数 6)数字转换为二进制数字同时保持原始输入中的最大熵并不完全简单。
random - CUDA 中的随机数生成器
我整天都在为此苦苦挣扎,我试图在我的 CUDA 代码中为线程获取一个随机数生成器。我浏览了所有论坛,是的,这个话题出现了很多,但我花了几个小时试图解开各种代码,但无济于事。如果有人知道一个简单的方法,可能是一个可以调用的设备内核返回一个介于 0 和 1 之间的随机浮点数,或者一个我可以转换的整数,我将不胜感激。
同样,我希望在内核中使用随机数,就像 rand() 一样。
提前致谢
c++ - A*X MOD (2^N)-1 的倒数
给定一个函数 y = f(A,X):
对于'x'的所有值,我如何找到反函数 x = g(A,y) 使得 x = g(A, f(A,x))?
如果 f() 对于 'x' 的所有值都不可逆,那么最接近倒数的是什么?
(F 是一个过时的 PRNG,我试图了解如何反转这样的功能)。
- 更新
如果 A 与 (2^N)-1 互质,则 g(A,Y) 就是 f(A-1, y)。
如果 A 不是相对素数,则 y 的范围受到限制……如果限制在该范围内,g(·) 是否仍然存在?
c++ - 多次播种伪随机数生成器的问题?
我已经看到很多建议不要在每次执行时多次播种伪随机数生成器,但从未附有详尽的解释。当然,很容易看出为什么以下 (C/C++) 示例不是一个好主意:
get_rand
因为每秒调用几次会产生重复的结果。
但是下面的例子难道不是一个可以接受的解决方案吗?
MyRand.h
我的兰德.cpp
主文件
即,即使MyRand
:s 构造函数被快速连续调用多次,每次调用srand
都有不同的参数。显然,这不是线程安全的,但同样也不是rand
.
c - c / Unix中的多个随机数生成器状态
我在 Unix 系统上使用 srandom() 和 random() 在 c 中生成随机数。我想要多个RNG。每个给定相同的种子,都应该输出相同的序列。我还想保存和恢复每个的状态。这是一个伪代码示例:
我该怎么做呢?有时 RNG 会分叉到不同的线程中,我也需要在创建新线程时复制 RNG 的状态。
security - 使用 Fortuna PRNG 在计数器模式下使用 AES 进行随机访问加密:
我正在构建基于 AES 的文件加密,它必须能够在随机访问模式下工作(访问文件的任何部分)。例如,可以在 Counter 中使用 AES,但众所周知,我们需要一个从未使用过两次的唯一序列。在这种情况下是否可以使用简化的 Fortuna PRNG(使用特定于特定文件的随机选择的唯一密钥加密计数器)?这种方法有弱点吗?
所以加密/解密看起来像这样
在偏移量处加密块:
在 Offset 处解密块:
一项观察。我自己想到了 Fortuna 中使用的想法,后来肯定发现它已经被发明了。但正如我所读到的,关于它的关键点是安全性,但还有另一个好处:可以说它是一个很棒的随机访问伪随机数生成器(以简化形式)。因此,PRNG 不仅可以产生非常好的序列(我用 Ent 和 Die Hard 对其进行了测试),而且如果您知道步骤编号,还允许访问任何子序列。那么在安全应用程序中使用 Fortuna 作为“随机访问”PRNG 通常可以吗?
编辑:
换句话说,我建议使用 Fortuna PRNG 作为调整,以形成具有随机访问能力的可调整 AES 密码。我阅读了 Liskov、Rivest 和 Wagner 的作品,但无法理解操作模式中的密码和可调整密码之间的主要区别是什么。他们说他们建议将这种方法从密码本身的高层引入,但例如在我的情况下,通过调整对纯文本进行异或,这是否是调整?
integer - 伪随机序列发生器不仅仅是一个数字发生器
我需要一种算法,它几乎可以将 unix 时间戳转换为适当的随机数,这样如果我“回放”时间戳,我就会得到相同的随机数。
这就是我所说的适当的意思:
- 大多数人不会在随机数中检测到循环或模式。
- 它不需要是密码安全的。
- 所有数字都必须能够生成。(我发现 LFSR 不这样做)
- 数字是 32 位整数
我希望它相当快。
到目前为止,我的想法是一遍又一遍地播种 PRNG,但我不确定这是否是处理这个问题的最佳方法。
任何想法和想法将不胜感激。
谢谢。
c# - 寻找可以使用任意数量字节播种的 PRNG
我正在寻找您最初使用任意字节数组播种的 PRNG(伪随机性)。
听说过吗?