问题标签 [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.
encryption - CSPRNG + XOR 会是一种安全的加密方法吗?
与 RC4(RC4_PRNG+XOR)类似,使用另一个 CSPRNG(加密安全伪随机数生成器)[Isaac、BlumBlumShub 等)代替 RC4 并将数据与生成的密钥流异或是否安全?
algorithm - 是否存在没有隐藏状态的“好”PRNG 生成值?
我需要一些好的伪随机数生成器,它可以像纯函数一样从其先前的输出中计算出来,而不会隐藏任何状态。在“好”下,我的意思是:
我必须能够以这样的方式对生成器进行参数化,即
2^n
使用任何参数(或它们的一些大子集)运行它以覆盖所有或几乎所有介于0
和之间的值2^n - 1
,其中n
是输出值中的位数。位的组合生成器输出
n + p
必须涵盖所有或几乎所有值0
,2^(n + p) - 1
如果我针对2^n
其参数的每个可能组合运行它进行迭代,其中p
是参数中的位数。
例如,LCG可以像纯函数一样计算,它可以满足第一个条件,但不能满足第二个条件。假设我们有 32 位 LCG,m = 2^32
并且它是常数,我们的p = 64
(两个 32 位参数a
和c
)n + p = 96
,所以我们必须从输出中查看三个整数的数据以满足第二个条件。不幸的是,由于输出中奇偶整数的严格交替序列,无法满足条件。为了克服这个问题,必须引入隐藏状态,但这会使函数不纯并打破第一个条件(长隐藏期)。
编辑:严格来说,我想要按p
位参数化并具有完整n
位状态的函数系列,每个函数都以独特的“随机”方式生成所有可能的二进制位字符串p + n
,而不仅仅是连续递增(p + n)
-bit int。选择该独特方式所需的参数化。
我想要的太多了吗?
reverse - 可逆伪随机序列发生器
我想要某种方法来创建一个相当长的随机数序列,我可以前后翻阅。就像一台带有“下一个”和“上一个”按钮的机器,它会给你随机数。
像 10 位分辨率(即 0 到 1023 范围内的正整数)之类的东西就足够了,并且有 >100k 的数字序列。这是一个简单的游戏类型的应用程序,我不需要加密强度随机性或任何东西,但我希望它感觉相当随机。不过,我的可用内存量有限,所以我不能只生成一大块随机数据并遍历它。我需要在“交互时间”中获取数字——我可以轻松地花几毫秒思考下一个数字,但不会比这更舒服。最终它将在某种微控制器上运行,可能只是一个 Arduino。
我可以用一个简单的线性同余生成器(LCG)来做到这一点。向前走很简单,向后走我必须缓存最近的数字并每隔一段时间存储一些点,这样我就可以从那里重新创建序列。
但也许有一些伪随机生成器可以让你前进和前进?应该可以连接两个线性反馈移位寄存器 (LFSR) 以向不同方向滚动,不是吗?
或者也许我可以使用某种散列函数来混淆索引号?我要先试试。
还有其他想法吗?
random - 如何生成错误的随机数
我敢肯定已经多次提出相反的问题,但我找不到任何关于如何生成错误随机数的答案。
我想编写一个用于聚类分析的小程序,并想生成一些随机点进行测试。如果我只是插入 1000 个具有随机坐标的点,它们将分散在整个字段中,这将使聚类分析变得毫无价值。
有没有一种简单的方法来生成构建集群的随机数?
我已经考虑过不使用random()
但random()*random()
会生成正态分布的数字(我想我在 Stack Overflow 的某个地方读到了这个)。
第二种方法是随机选择几个区域并在该区域再次运行点生成,这当然会在该区域产生一个集群。
你有更好的主意吗?
testing - 如何测试 PRNG?
最近我为 64 位integer
(或long
)实现了 MersenneTwister。是否有关于如何测试 PRNG 的指南或示例,以便我可以知道我的实现是否是足够好的解决方案。我对如何验证我的实现是否具有足够好的均匀分布特别感兴趣。
这与 MersenneTwister 相关的越具体越好。
ruby - 在 Ruby 中生成符合概率分布的数字数组?
假设我有 100 条记录,我想模拟出created_at
日期,使其适合某个曲线。有没有图书馆可以做到这一点,或者我可以使用什么公式?我认为这是同一条轨道:
我不太了解它们在数学中的分类方式,但我正在研究以下内容:
- 钟形曲线
- 对数(典型的生物学/进化)曲线?...
只是在代码中寻找一些公式,所以我可以这样说:
- 给定 100 条记录,时间跨度为
1.week
,时间间隔为12.hours
- 为每个记录设置
created_at
,使其大致适合curve
非常感谢!
更新
我发现了这个关于 ruby 算法的论坛帖子,这让我找到了rsruby,一个 R/Ruby 桥,但这似乎太多了。
更新 2
我写了这个小片段尝试gsl
图书馆,到达那里......
algorithm - 具有均匀分布的随机变长编码数字
假设当我可以检索解析某些虚拟 b-tree 的数据并在到达项目时停止(类似于 Huffman 编码)时,我有数据以可变长度编码呈现。项目数量未知(在最好的情况下,只有上限是已知的)。是否有生成均匀分布数字的算法?问题是在这种情况下,基于硬币的算法会给出不一致的结果,例如,如果有一个编码为 101 的数字和一个编码为 10010101 的数字,与前者相比,后者将很少出现。
更新:换句话说,当每个元素都可以用任意数量的位寻址时,我有一组最大 N 个元素(但可能更少)(并且根据信息理论,所以如果一个被编码为 101 则没有其他元素可以是用相同的前缀编码)。因此,当我根据一点向左或向右移动时,它更像是 B-Tree,有时我会到达数据项。我想得到一个用这种技术解决的随机数序列,但它们的分布应该是均匀的(上面的例子为什么随机选择左右不起作用,数字 101 和 10010101)
谢谢
最大限度
algorithm - 随机拍摄之间的用户延迟是否对 PRNG 有很好的改进?
我认为,为了随机选择播放器中的下一首曲目或浏览器中的下一页,可以将时间用作“自然现象”,例如体面的 RPNG 可以在没有程序请求的情况下连续获取下一个随机数(对于例如在一个线程中每隔几毫秒或更频繁地发生事件)并且当时间到来时(基于用户决定),选择自然会受到此用户延迟的影响。
这种方法是否足够好,如何进行测试?手动测试的问题是我不能在现实世界中等待那么长时间来保存足够的随机数来将它们提供给一些测试程序。任何人为的加速这一过程的尝试都会使该方法本身无效。
谢谢
math - 您的伪随机数生成器 (PRNG) 是否不够随机?
您是否曾经编写过因使用的(伪)随机数的质量而遇到麻烦的模拟或随机算法?
发生了什么事?
您是如何检测/意识到您的 prng 是问题所在?
切换 PRNG 是否足以解决问题,或者您是否必须切换到真正随机性的来源?
我试图弄清楚哪些类型的应用程序需要人们担心它们的随机性来源的质量,以及当这成为一个问题时人们如何意识到这一点。
algorithm - 将 Int 均匀随机范围缩放为双一
实际上,我有几个相互交织的问题。(如果重要的话,我会使用 C#。)
第一的。我有一个 prng 生成 UInt32 范围内的随机数,从 0 到 UInt32.Max 包括在内。我想尽可能地保持一致性。得到[a,b],(a,b)双范围的主要思想是什么(如[0,1],[0,1),(0,1),[-2,4],(- 10,10))?
我担心以下问题。我有 4 294 967 296 个 prng 结果。它小于 [0,1] 双倍范围内的数字 - 2^53。所以我从 2 位数字中构造了 4 294 967 296 进制数,它在 [0, 4294967295 * 4294967296 + 4294967295] 中是随机且均匀的。这个最大值在 1 上大于 2^53,所以如果一个得到它就扔掉它,重新计算,使用 mod 2^53 并在例如 [0,1] 中获得统一的数字。这里我必须将最大值表示为 double(假设没有 Int64 类型)——它有什么缺点吗?
现在,如果我想得到 [0,1),我认为结果的数量是 (2^53) - 1。添加到最后一个结果 1/(2^53) 将在 (0,1] 中产生随机双倍. 要获得 (0,1) 我考虑 (2^53) - 2 个新结果并将 1/(2^53) 添加到基于 0 的结果。所有这些都正确吗?
但是如何获得接近或等于整个双倍范围的双倍范围?即使我像上面那样构造 n 进制数,它也可能变得比 Double.Max 大。可能有一些位移/位掩码方法是可能的吗?
第二。现在有结果在 [0,1) 中的双 prng 是否有可能获得 [Double.Min, Double.Max] 范围?一共有多少个双数?如果有完整的双范围 prng,获得 UInt 范围的最佳方法是什么——“直接”映射或之前缩放到 [0,1]?
第三。我找到了这段代码(http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c):
为什么 a 和 b 被转移到 5 和 6 以及为什么之后 a*67108864.0+b 是统一的?
谢谢你。