问题标签 [lcg]
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 - 为什么 util Random 类中有 48 位种子?
为什么这个类在其线性同余公式中使用 48 位种子?我本来预计32或64 ...
我知道当要求 32 位值时它需要更高位。但是为什么只有 16 个额外的位呢?这是一个“随机”的选择吗?
.net-4.0 - 轻量级代码生成 (LCG) 已死?
在 .NET 2.0-3.5 框架中,LCG(又名 DynamicMethod 类)是一种在运行时发出轻量级方法的好方法,而无需类结构来支持它们。
在 .NET 4.0 中,表达式树现在支持语句和块,因此似乎提供了足够的功能来构建您可能需要从这种方法中获得的任何功能,并且可以以比直接发出 CIL 更容易和更安全的方式构建操作码。(此声明源自今天将一些最复杂的 LCG 代码转换为使用表达式树构建和编译的实验。)
那么有什么理由可以在任何新代码中使用 LCG 吗?有什么表达树不能做的事情吗?或者它现在是一个“死”的功能?
python - 如何在不预先生成整个序列的情况下生成可预测的序列改组?
以下 python 代码准确描述了我想要为任意大小(人口)的序列实现的目标:
该方法的问题在于它需要首先在内存中生成整个序列。对于庞大的人口来说,这可能是一个问题。
请注意,此方法的一个潜在优势是您可以随时选择任何数组位置。
现在 - 如果手头的问题恰好让您将总体大小设置为 2 的幂(负 1),则可以使用线性反馈移位寄存器来获得可预测的随机序列。LFSR 很简洁,并且在有关它们的维基百科文章中得到了很好的解释。
下面的 python 代码演示了这一点(我做了一堆唯一性测试以确保它像宣传的那样工作)。再次查看维基百科文章以了解代码如何工作(伽罗瓦配置)。
这很好,因为您可以拥有庞大的人口并轻松计算可重复的非重复随机数序列,而无需使用大量内存。
缺点是 a) 它仅限于大小为 (2**N - 1) 的“改组”序列,以及 b) 您无法确定随机序列中特定位置的值在任意位置是什么。您需要知道特定点的值并从那里遍历序列。
后者 (b) 大多是可以的,因为大多数时候你会按顺序生成序列,所以你只需要记住最后一个值。2限制(a)的力量是一种交易杀手,虽然......取决于应用程序。
对于任意序列长度,您如何实现类似最大长度 LFSR 的非重复结果?
作为奖励,最好有一个解决方案,您可以知道给定序列位置的数字,而无需遍历序列到该位置。
注意:如果您想为最大长度的 LFSR(生成整个寄存器群而不重复一次的 LFSR 抽头位置)设置一个良好的起始 LFSR 抽头位置,此链接非常好,并且每个寄存器大小有大量抽头位置(最多无论如何,32位)。
另请注意,我已经看到许多与我的问题和洗牌/LFSR 密切相关的问题,但没有一个与我所追求的完全相关(任意大小线性序列的可预测洗牌)。或者至少在我能够理解的范围内,无论如何。
我最近一直在研究Linear Congruential Generators,这似乎很有希望,但我还不能让它们工作。我不会再坐在这个问题上,而是会问它,如果我弄明白并且它们起作用了,就会发布答案。
matlab - MatLab 中的 LCG 实现
嗨,我在 MatLab 中创建线性同余生成器时遇到了麻烦,我发现在线工作与我的完全不同。然后我试图打印 m 和 a 的值(相对素数,m 显然是一个大素数)并检查循环何时满。我知道所有的数学知识,我已经习惯了 matlab 并且很难为我实现这个,即使我应该知道。我的程序如下所示:
我对 MatLab 也不太熟悉,所以我可能以错误的方式创建数组。提前致谢。
javascript - JavaScript 中的自定义线性同余生成器
我正在尝试在 JavaScript(glibc 中使用的那个)中创建一个自定义线性同余生成器(LCQ)。
它在维基百科上的属性是:m=2^31
, a=1103515245
, c=12345
.
现在我得到下一个种子价值
虽然生成器似乎可以工作,但是当在画布上测试数字时:
他们似乎有可怕的偏见:http: //jsfiddle.net/7VmR9/3/show/
为什么会这样?通过选择不同的模数,视觉测试的结果看起来要好得多。
测试 JSFiddle 在这里:http: //jsfiddle.net/7VmR9/3/
更新
最后,我将转换固定为画布坐标,如下公式所示:
现在像素坐标不像使用模运算时那样畸形。
更新小提琴:http: //jsfiddle.net/7VmR9/14/
c# - LCG 创建方法来设置类中所有属性的子集(反射替换;c#)
场景:我有这门课
用户只能选择例如FirstName
和Age
。
目前我正在使用反射,但有人告诉我反射会损害性能。
任何人都可以向我展示如何使用轻量级代码生成来执行此操作(仅设置类中所有字段的子集)的示例吗?
maple - Maple:RNG不是随机的
我用蒙特卡洛方法“寻找 Pi”,但答案不正确。原始代码是:
它给出了 2.8-2.85 左右的答案
当我将代码更改为
那么答案是正确的。我不知道为什么我不能在“for”循环中生成数字。
我发现它的平均值是相同的,但方差是不同的。为了:
输出是:
它出什么问题了?GenerateFloat() 应该尽可能统一。
c++ - 伪随机分布,保证值序列的所有可能排列 - C++
随机问题。
我正在尝试创建一个会生成伪随机分布的程序。我正在尝试为我的需要找到正确的伪随机算法。这些是我的担忧:
1)每次使用时我都需要一个输入来生成相同的输出。
2)它需要足够随机,以使查看输入 1 的输出的人看不到它与输入 2 的输出(等等)之间没有任何联系,但不需要它是加密安全的或真正随机的。
3)它的输出应该是一个介于 0 和 (29^3200)-1 之间的数字,该范围内的每个可能的整数都是一个可能且同样(或接近)可能的输出。
4)我希望能够保证 410 个输出序列的每个可能排列也是连续输入的潜在输出。换句话说,0 到 (29^3200)-1 之间的 410 个整数的所有可能分组应该是顺序输入的潜在输出。
5)我希望函数是可逆的,这样我就可以取一个整数或一系列整数,并说出哪个输入或一系列输入会产生该结果。
到目前为止我开发的方法是通过一个简单的 halson 序列运行输入:
并将结果乘以 29^3200。它满足要求 1-3,但不满足要求 4。而且它只对单个整数可逆,而不是对数列可逆(因为不是所有数列都可以由它产生)。我在 C++ 中工作,使用 boost 多精度。
任何人可以给我的关于生成满足这些要求的随机分布的方法的任何建议,或者只是为此目的值得研究的一类算法,将不胜感激。提前感谢您考虑我的问题。
- - 更新 - -
由于多个评论者都关注相关数字的大小,我只是想明确表示,我认识到使用这些集合会带来的实际问题,但在提出这个问题时,我只对理论或概念方法感兴趣问题 - 例如,想象使用更小的整数集(如 0 到 99)以及 10 个输出序列集的排列。您将如何设计一种算法来满足这五个条件 - 1)输入是确定性的,2)出现随机(至少对人眼而言),3)范围内的每个整数都是可能的输出,4)不仅是所有值,而且值序列的所有排列都是可能的输出,5)函数是可逆的。
---第二次更新---
非常感谢@Severin Pappadeux,我能够反转 lcg。我想我会添加一些关于我所做的事情,以希望将来让任何人更容易看到这一点。首先,这些是反模函数的极好资源:
https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/modular-inverses
https://www.khanacademy.org/computer-programming/discrete-reciprocal-mod-m/6253215254052864
如果你采用等式 next=ax+c%m,使用下面的代码和你的 a 和 m 值将打印出你需要找到 ainverse 的欧几里得方程,以及 ainverse 的值:
我花了一段时间才弄清楚的另一件事是,如果你得到一个否定的结果,你应该给它加上 m。您应该在新方程中添加一个类似的项:
我希望这对将来在这条路上冒险的人有所帮助。
java - 在java中生成给定方法的多次抽奖(调用)(模拟彩票)
我收到了用java模拟彩票抽奖的任务。程序框架产生方法 generateOneDraw,它创建 6 个介于 1 和 49 之间的随机数
然后我们需要实现一个函数来模拟 5 周内的彩票抽奖并将它们存储在变量 draws 中。我相信这应该在二维数组上完成。我的这种想法对吗?任何有关实现它的指针将不胜感激。
提前致谢。
编辑:没关系,我用一个简单的二维数组完成了它并且它有效。
algorithm - 非常大集合的动态伪随机排列,不重复且具有逆运算
我有一组非常大的值(0-300000^700),我想找到一种算法,它可以在同一组中双向分配一个唯一值。
它相当于一个排列,但由于明显的内存问题,必须“即时”完成。并且该算法需要在某个时候反转。
这个问题类似于“巴别库”中的这个问题: http ://www.fromquarkstoquasars.com/meet-the-digital-library-of-babel-a-complete-combination-of-every-possible-combination -永远的字母/
使用 LCG,使用 Hull-Dobell 定理设置参数以确保不重复。种子用作初始值。我没有得到的是逆是如何可能的(即从输出中获取种子),因为我认为这需要蛮力。