周期可调的PRNG

2024-03-02

我需要构建一个周期可调的就地伪随机数生成器。另外,在一段时间内不得发生碰撞。也就是说,以下内容必须返回 true:

// prng is "generated" at run-time
// (though a by-hand solution would work)

bool test(func prng, int period) {
    int seed = 0;  // Any number should work
    int cur = seed;

    for (int i = 0; i <= period; ++i) {
        cur = prng(cur);

        if (cur == seed) {
            if (i == period) {
                // We hit our period on target
                return true;
            }

            // Period too low (we hit our seed already!)
            return false;
        }
    }

    // Period too high
    return false;
}

(示例是伪代码;任何常用可读语言(C++、Python、Haskell 等)的答案都是可以接受的。)

PRNG 必须not取决于生成数字时的可变静态。也就是说,我不能有一个包含已返回数字的大表或类似的东西。它应该只依赖给定的输入来生成下一项。

该算法不必具有加密强度(当然),或“强”随机性。然而,x % period是不能接受的;它必须至少是somewhat random.

我研究过线性同余生成器,但这对于我的特定约束来说似乎是错误的路径。

(暴力破解不是一种选择,除非它相对较快(几秒钟)。)


我认为一个好的候选人是斐波那契线性反馈移位寄存器 (LFSR).

您可以从以下位置获取相关信息和算法维基百科 http://en.wikipedia.org/wiki/Linear_feedback_shift_register.

只是摘录:



The initial value of the LFSR is called the seed, and because the operation 
of the register is deterministic, the stream of values produced by the 
register is completely determined by its current (or previous) state. 
Likewise, because the register has a finite number of possible states, it must 
eventually enter a repeating cycle. However, an LFSR with a well-chosen 
feedback function can produce a sequence of bits which appears random and 
which has a very long cycle.
  

The only problem is that the periods for the LFSR are always of the form 2N-1.
You could overcome this noting that for any wanted period P, choosing the N that gives you the "next" 2N-1 value leaves potentially 2(N-1)-1 numbers to supress from the cycle (because if you need to supress more than that, just generate with N-1).

So, to supress k values (k = ((2N-1) - P) ⋳ {1 ... ,2(N-1)-1}) you can add a little logic such as



    If (Mod(cur,2(N-1)+1-k) == 0) Then
       cur=Mod(cur+1,2N-1)
  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

周期可调的PRNG 的相关文章

  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • Win32:是否可以构建一个容纳其他应用程序的应用程序?

    我想知道 您将如何编写一个基本上包含其他应用程序的应用程序 我问这个问题的原因是我想构建一个应用程序来 征服 我目前打开的窗口数量激增的情况 我以前使用过虚拟窗口管理器 它们非常好 但是我可以使用我提到的应用程序做很多事情 或者 有人知道有
  • 如何快速从文件夹树中选取随机文件?

    我试图从文件夹树中选择一个随机文件 从固定路径开始 并在所有子文件夹 或所选文件夹本身 中递归 搜索 我的想法是 创建文件列表 计算文件数量 在该范围内选择一个随机数 然后选择该索引处的文件 这是我的代码 create list of al
  • 在 C# 中生成随机值

    如何使用以下命令生成随机 Int64 和 UInt64 值RandomC 中的类 这应该可以解决问题 这是一个扩展方法 因此您可以像调用普通方法一样调用它Next or NextDouble上的方法Random目的 public stati
  • 如何计算某物是否位于某人的视野中

    我有一个对象 它在 2D 空间中具有位置和速度 两者都由向量表示 对象的视野每侧均为 135 度 它看起来与移动的方向相同 速度矢量 我有一些对象 其在 2D 空间中的位置由向量表示 在图中 蓝色背景上的对象是可见的 红色背景上的对象对主体
  • 从 Go Slice 中选择一个随机值

    情况 我有一些值 需要从中随机选择一个值 然后我想将它与固定字符串连接起来 到目前为止 这是我的代码 func main create the reasons slice and append reasons to it reasons m
  • 如何生成泊松过程?

    原问题 我想生成一个泊松过程 如果按时间到达的人数t is N t 我有一个带有参数的泊松分布 我如何生成N t 我将如何在 C 中做到这一点 澄清 我最初想使用泊松分布生成过程 但是 我对我需要的过程参数感到困惑 我以为我可以用N t 但
  • 在Python中选择长度为n的随机列表元素

    我知道你可以使用 random choice 从列表中选择一个随机元素 但我试图选择长度为 3 的随机元素 例如 list1 a b c d e f g h 我希望输出看起来像这样 c d e 本质上我想从列表中生成随机子列表 Use ra
  • jQuery 从 $(selector) 返回的选择中获取随机元素

    If my element 匹配多个元素 有没有一种快速的方法可以从中获取随机元素 fn random function return this eq Math floor Math random this length selector
  • 识别鼠标移动的算法

    我想知道是否有任何研究 算法可以指定鼠标在识别 等字符时的偏差量使用鼠标绘制 某种光学字符识别 但可能是一个更简单的版本 是否有某种算法可以让我说用户绘制的问号确实是一个问号 而不是其他具有一定准确性的东西 就像 Windows 平板电脑软
  • 当平方和为N时,如何找到四个变量的所有可能值?

    A 2 B 2 C 2 D 2 N给定一个整数N 打印出整数值的所有可能组合ABCD求解方程 我猜我们可以比暴力做得更好 天真的暴力会是这样的 n 3200724 lim sqrt n 1 for a 0 a lt lim a for b
  • 在 C 或 C++ 中用 1 到 10^10 之间的随机数填充数组

    我的分配的一部分基于一个数组 其大小由用户指定 其中包含从 1 到 10 10 的随机数 然后我们必须找到数组中第 k 个较小的数字 这是我尝试过的 include
  • 内存高效的随机数迭代器,无需替换

    我觉得这应该很容易 但经过多次搜索和尝试后我找不到答案 基本上 我有大量的物品 我想以随机顺序进行采样 而不需要更换 在本例中 它们是二维数组中的单元 我用于较小数组的解决方案不会转换 因为它需要对内存数组进行改组 如果我必须采样的数量很小
  • 有哪些学习线程编程的好资源? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 随着多核CPU在桌面上的兴起 多线程技能将成为程序员的宝贵资产 您能为想要学习线程编程的程序员推荐一些好的资源 书籍 教程 网站等 吗 看
  • 使用什么算法来确定使系统达到“零”状态所需的最小操作数?

    这是一种更通用的问题 不是特定于语言的 有关要使用的想法和算法的更多信息 系统如下 它登记朋友群体之间的小额贷款 Alice and Bill要去吃午饭 比尔的卡坏了 所以爱丽丝支付了他的餐费 10 美元 第二天Bill and Charl
  • 在 Excel 中生成随机 -1 和 +1 值

    The Rand 函数会生成一个 0 到 1 之间的实数 这Randbetween 1 1 将生成 1 0 或 1 我想要的只是 1或1 那么 1 到 1 之间的实数呢 Easy IF RAND lt 0 5 1 1 要获得实数 请使用 R
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 随机采样数组的唯一子集

    如果我有一个数组 a 1 2 3 如何随机选择数组的子集 以使每个子集的元素都是唯一的 也就是说 对于a可能的子集是 1 2 3 1 2 2 3 1 2 3 我无法生成所有可能的子集 因为 a 的实际大小非常大 因此有很多很多子集 目前 我
  • 查找字符串中最常见的子字符串的算法

    是否有任何算法可用于查找字符串中最常见的短语 或子字符串 例如 以下字符串将 hello world 作为其最常见的两个单词短语 hello world this is hello world hello world repeats thr
  • 我应该用不可变或可变的数据结构来表示数据库数据吗?

    我目前正在使用 Scala 进行编程 但我想这适用于任何函数式编程语言 或者更确切地说 任何建议不变性并可以与数据库交互的编程语言 当我从数据库中获取数据时 我将其映射到模型数据结构 在函数式编程中 数据结构往往是不可变的 但是数据库中的数

随机推荐

  • 在eclipse中使用jsr305注释Findbugs没有发现bug

    我一直在尝试将 jsr 305 注释与 Findbugs 一起使用 特别是 CheckForNull 注释 它可以避免我刚刚发现的向客户报告的错误 我已将 jsr305 jar 和annotations jar 添加到我的构建路径中 但 f
  • 安排大 ETA 的 celery 任务

    我目前正在使用 celery 尝试未来的任务ETA http docs celeryproject org en latest userguide calling html eta and countdown功能和 Redis 代理 使用
  • 减少 Mercurial 中的存储库大小

    当我的团队使用 Mercurial 存储库中的源代码处理给定项目时 存储库的大小显然在增长 因此 通过网络克隆存储库变得越来越慢 是否有任何技术可用于删除较旧的提交或减小存储库的大小 以使克隆操作在慢速网络上更快 我们使用 Tortoise
  • 查找列表中最流行的单词

    我有一个单词列表 words all awesome all yeah bye all yeah 我想获得一个元组列表 3 all 2 yeah 1 bye 1 awesome 每个元组在哪里 number of occurrences w
  • Rails 中如何让 Low-Level caching 与 Association caching 协同工作?

    我目前正在开发一个使用 Rails 5 的项目 我想提高性能 所以我决定使用低级缓存 如下所示 class User lt ApplicationRecord has one profile def cached profile Rails
  • 当我尝试上传视频时,Youtube API v3 返回 401

    我使用 YouTube 的 ServiceAccount 上传器 我使用 Youtube API v3 我有简单的控制台应用程序 可将视频上传到 youtube String serviceAccountEmail var certific
  • ParNew gc 会阻止世界吗?

    我看到 GC 输出如下 2010 12 10T16 00 44 942 0800 1443 562 GC 1443 562 ParNew 201856K gt 17318K 201856K 0 0352970 secs 2113334K g
  • 如何在java中使用dd-mm-yyyy格式将字符串格式化为日期[重复]

    这个问题在这里已经有答案了 我需要一些支持 我希望将变量字符串转换为日期 变量日期的格式应为 dd MM yyyy import java util Date String a 2022 05 12 Date b should be dd
  • mapActivity 中出现 NoClassDefFoundError

    我的地图应用程序中出现此错误 您知道出了什么问题吗 我已经检查过 该包在我的 java 文件中是正确的 而且我已将谷歌地图的使用库放入我的应用程序标签中的 manifest xml 中 请帮忙 我花了几个小时来解决它 确保您已输入
  • Azure API 管理服务中的静态 IP 地址

    我已经做了一些谷歌搜索 但无法得到确认的答案 Azure API 管理服务是否提供静态 IP 地址 如果没有 我该如何配置 我问的原因是因为我的本地服务器仅接受来自白名单 IP 地址的请求 因此我们需要来自 Azure API 管理的请求的
  • mingw 链接器找不到 PathAppend

    当我尝试编译以下内容时 include
  • 自定义设计EditText

    我有定制设计EditText 搜索页面 xml
  • 如何在 Redux 中处理两个连续且依赖的异步调用?

    我通过调用操作异步获取帖子列表fetchPosts从一个组件开始componentDidMount 我希望 一旦相关减速器 更新状态 收到并处理该请求 就调用另一个操作fetchPostsMetaData 包含刚刚收到的帖子 id 的数组
  • 像 Google Play 商店一样折叠工具栏

    我想实现一个像 google Play 商店一样的折叠工具栏 我已经实现了一些功能 但这仅适用于纵向屏幕 这是我能够执行的操作的屏幕截图示例 现在我想做的是 当我将设备方向更改为景观模式时 它应该看起来完全像这样 所以我的主要问题是如何处理
  • 如何处理大型 git 存储库?

    我目前正在使用 git 来构建大型存储库 大约 12 GB 每个分支的大小为 3 GB 该存储库包含大量二进制文件 音频和图像 问题是克隆和拉取可能需要很多时间 特别是 解决增量 步骤可能非常非常长 解决此类问题的最佳方法是什么 我尝试删除
  • 如何在javascript中检查异步加载的脚本是否已完成加载

    使用 javascript 异步下载另一个 javascript 文件 我知道这可以通过在页面上插入一个新的脚本标签来完成src属性设置为文件 url 脚本下载完成后 我还需要运行一些代码 我一直在使用yepnope http yepnop
  • 出现 gdbm 错误:(13,'权限被拒绝') — 尽管 posix 权限看起来没问题

    我正在 python 2 7 6 中使用 shelve 进行缓存计算 并且遇到了所描述的问题HERE https stackoverflow com q 35771816 4038337对于我制作并实施的搁置文件建议的解决方案 https
  • 无法启动模拟器。原因:当react-native run-android时,模拟器在React Native启动之前退出

    我正在根据这个网站安装React Nativehttps medium com leonardobrunolima react native tips setting up your development environment for
  • 在 XAML 绑定表达式中使用变量

    我正在构建一个可以编辑 POCO 的控件 POCO 中有一个需要编辑的字段的描述符集合 我正在绑定一个ListBox s ItemsSource到这个集合 除其他外 描述符使我能够选择合适的DataTemplate以及 POCO 中的变量名
  • 周期可调的PRNG

    我需要构建一个周期可调的就地伪随机数生成器 另外 在一段时间内不得发生碰撞 也就是说 以下内容必须返回 true prng is generated at run time though a by hand solution would w