n 组位的高效随机排列

2023-12-04

对于产生精确的位模式的问题n设置位,我知道两种实用的方法,但它们都有我不满意的局限性。

首先,您可以枚举在预先计算的表中设置了那么多位的所有可能的字值,然后在该表中生成一个随机索引以挑选出可能的结果。这样做的问题是,随着输出大小的增长,候选输出列表最终会变得不切实际的大。

或者,您可以选择n随机不重叠的位位置(例如,通过使用部分 Fisher-Yates 混洗)并仅设置这些位。然而,这种方法在比可能结果的数量大得多的空间中计算随机状态。例如,它可以选择三个比特中的第一位和第二位,或者它可以单独选择第二位和第一位。

第二种方法必须消耗比严格要求更多的随机数源位。既然是选择n当它们的顺序不重要时,按特定顺序排列位,这意味着它正在任意区分n!产生相同结果的不同方式,并且至少消耗floor(log_2(n!))比需要的更多位。

这可以避免吗?

显然还有第三种方法,即迭代计算并计算合法排列,直到达到随机索引,但这只是第一种方法的空间与时间权衡,除非存在有效的方法,否则没有直接帮助。计算这些的方法n排列。


澄清

The first approach requires picking a single random number between zero and <code>w! / (n!*(w-n)!)</code> (where w is the output size), as this is the number of possible solutions.

The second approach requires picking n random values between zero and w-1, zero and w-2, etc., and these have a product of <code>w! / (w-n)!</code>, which is <code>n!</code> times larger than the first approach.

这意味着随机数源被迫产生位来区分n!不同的结果都是等价的。我想知道是否有一种有效的方法来避免依赖这种多余的随机性。也许通过使用产生位位置无序列表的算法,或者通过直接计算第 n 个唯一的位排列。


看来你想要弗洛伊德算法的变体:

选择单个随机值组合的算法?

在您的情况下应该特别有用,因为遏制测试是一个简单的位掩码操作。这将只需要k呼叫 RNG。在下面的代码中,我假设您有randint(limit)它产生一个均匀的随机数0 to limit-1,以及你想要的k32 位 int 中设置的位:

mask = 0;
for (j = 32 - k; j < 32; ++j) {
    r = randint(j+1);
    b = 1 << r;
    if (mask & b) mask |= (1 << j);
    else mask |= b;
}

这里需要多少位熵取决于如何randint()已实施。如果k> 16,设置为 32 -k并否定结果。

您的另一种建议是生成代表集合中一种组合的单个随机数(数学家将其称为rank如果您使用 colex 顺序而不是字典顺序,则更简单。这段代码,例如:

for (i = k; i >= 1; --i) {
    while ((b = binomial(n, i)) > r) --n;
    buf[i-1] = n;
    r -= b;
}

将填充数组buf[]索引从 0 到n-1为了k-colex等级的组合r。在你的情况下,你会替换buf[i-1] = n with mask |= (1 << n)。 binomial() 函数是二项式系数,我使用查找表执行此操作(请参阅this)。这将最有效地利用熵,但我仍然认为弗洛伊德的算法将是更好的折衷方案。

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

n 组位的高效随机排列 的相关文章

  • jQuery.ready() 中应该包含什么内容,哪些内容应该在 jQuery.ready() 之外?

    jQuery ready 中应该包含哪些内容 哪些内容应该包含在 jQuery ready 之外 从性能的角度来看 我在某处读到将所有代码都包装在一个jQuery ready 这不是一个有效的方法 那么我的问题是 什么应该在里面 什么可以在
  • 以概率从列表中选择随机元素

    我有一个包含四个项目 A B C D 的列表 每个项目都有被选择的概率 例如 A 有 74 的机会被选中 B 15 C 7 D 4 我想创建一个函数 根据其概率随机选择一个项目 有什么帮助吗 为您的项目定义一个类 如下所示 class It
  • OpenMP 共享与第一私有性能比较

    我有一个 pragma omp parallel for在类方法内循环 每个线程只读访问很少的方法局部变量 很少调用私有数据和方法的参数 所有这些都在一个声明中声明shared条款 我的问题 性能方面不应该有任何区别声明这些 变量share
  • 使用非负约束进行优化

    考虑以下功能 import numpy as np import scipy optimize as opt import math Periodic indexation def pl list i return list i len l
  • 如何选择独特点

    我是一名 R 程序员新手 我有以下一系列观点 df lt data frame x c 1 2 3 4 y c 6 3 7 5 df lt df gt mutate k 1 df lt df gt full join df by k df
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • 打乱列表并返回副本

    我想对数组进行洗牌 但我找到的只是类似的方法random shuffle x from 在 Python 中随机化字符串列表的最佳方法 https stackoverflow com questions 1022141 best way t
  • 优化 Haskell 内循环

    仍在 Haskell 中进行 SHA1 实现 我现在已经有了一个有效的实现 这是内部循环 iterateBlock Int gt Word32 gt Word32 gt Word32 gt Word32 gt Word32 gt Word3
  • 如何使用 netlogo 生成 0.3 < X < 0.7 范围内的数字

    正如标题所示 希望生成 0 3 我目前使用 while 循环来检查随机浮点数是否在该范围内 我想知道是否有更好的方法来做到这一点 0 3 random float 0 4会给你 0 3 如果你真的不想要 0 3 我想你总是可以循环那个 我不
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在
  • 测试 xmm/ymm 寄存器是否为零的更快方法?

    It s fortunate that PTEST does not affect the carry flag but only sets the rather awkward ZF also affects both CF and ZF
  • 多维数组中的数组排列保留键 PHP

    这两天我一直在疯狂地尝试完成这个任务 也许你可以启发我 这是针对赛马投注排列的 每次用户玩游戏时 我都会得到一个多维数组 2 个级别 第一级包含比赛 ID 第二级包含用户为该比赛选择的马匹 它看起来像这样 play array 4 gt a
  • 如何通过从字母数字字符中采样来创建随机字符串?

    我尝试编译以下代码 extern crate rand 0 6 use rand Rng fn main rand thread rng gen ascii chars take 10 collect
  • 为什么 b = (b - x) & x 会得到下一个子集?

    The 有竞争力的程序员手册 https cses fi book book pdf第 99 页建议使用以下方法来遍历集合的所有子集x 集合位代表集合中的数字 int b 0 do Process subset b while b b x
  • 在现代 x86-64 上计算 64 位整数的整数 Log10 的最快方法是什么?

    标题 我找到了大量 32 位示例 但没有找到完整的 64 位示例 使用这个帖子 https codegolf stackexchange com questions 47290 fastest way to compute order of
  • 从某个文件夹启动随机批处理文件

    问题是这样的 我有一个名为 abc 的文件夹 其中包含几个批处理文件 它们的命名如下 abc1 batabc2 batabc3 batabc4 bat 等等 我需要一个脚本 当我单击它时 它会随机启动其中一个批处理文件 我需要的脚本将存储在
  • mySQL 返回可能有重复项的随机行

    我正在尝试随机化一定数量的行 但假设数据库中只有 4 行 而我需要获得 6 个随机行 我希望有可能 即使表中有超过 6 行 产生重复的行行 这在 mySQL 中很容易实现吗 我当前的查询是这样的 SELECT FROM winners OR
  • Apache JMeter:在请求正文中添加随机数据

    我正在 Apache JMeter 中对我们的应用程序进行压力测试 我想到调用注册用户方法 该方法将在数据库中添加用户 但如果电子邮件已存在 则不会发生数据库操作 如何在身体数据中添加随机数 或者有其他方法可以对与数据库连接的应用程序进行压
  • MySQL:你能指定一个随机限制吗?

    有没有办法在 SQL MySQL 中随机化限制数字 我希望能够做的是在查询中获取随机数量的结果以在插入子查询中使用 而无需任何服务器端脚本 我希望能够作为假设说明运行的查询是 SELECT id FROM users ORDER BY RA
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob

随机推荐

  • 如何在 Jaxb 中忽略 XML 中的某些标签

    我的xml文件如下
  • 使用 java 和 iText 签署 PDF 哈希值

    我有一个生成 PDF 的应用程序 需要签名 我们没有用于签署文档的证书 因为它们位于 HSM 中 而我们使用证书的唯一方法是使用 Web 服务 PdfReader reader new PdfReader src reader setApp
  • 无法让 pysnmp 与 pyinstaller 一起使用

    尝试让 pyinstaller 与 pysnmp 一起使用这是规范文件 mode python a Analysis app py pathex home robertja pysnmp hiddenimports None hookspa
  • 在 scipy 中重现 sox 频谱图

    例如 我有一个带有语音的 wav 文件 我可以使用 sox 创建漂亮的频谱图可视化 wget https google github io tacotron publications tacotron2 demos romance gt w
  • BitBlt - 使用另一个应用程序的 HDC 时捕获的像素全为零 (bgra)

    由于 Nick Nougat 的答案中的代码 我可以使用 BitBlt 和 GetDIBits 成功捕获部分屏幕here 捕获整个屏幕或桌面似乎可行 但是当我提供应用程序的 HDC 时 它会打印奇怪的数据 以 bgra 格式 HWND de
  • IE8 中的无表表格布局

    有没有办法复制exactly这个布局没有表格 仅使用CSS和div 没有Javascript IE8 http jsfiddle net u0u7snh6 2 我尝试过多种场景IE8似乎很混乱 Height of the content c
  • C# MessageBox 导致按键处理程序忽略 SuppressKeyPress

    考虑具有以下组件的 Windows 窗体应用程序 partial class Form1 private System Windows Forms TextBox textBox new System Windows Forms TextB
  • 将整个工作簿另存为 PDF Excel 2010 (C#)

    无论如何 有没有办法将整个工作簿保存为 excel 中的 pdf 格式 我找到了这个 http msdn microsoft com en us library bb407651 v office 12 aspx 但它并没有确切地告诉您是将
  • 类似于 HtmlUnit 的 C# 库

    我需要编写独立的应用程序来 浏览 外部资源 C 中是否有自动处理 cookie 并支持 JavaScript 的库 我相信不需要通过 JS 主要目标是保持会话活动并提交表单 以便我可以通过多步骤注册过程或在登录后 浏览 网站 我查看了 Ht
  • Pandas Wide_to_long,id变量需要唯一标识每一行

    假设我有一个像这样的数据框 ID Time1 Value1 Time2 Value2 Time3 Value3 1 2 1 1 3 1 2 4 1 3 1 5 2 1 6 2 2 7 2 3 预期的数据框是这样的 ID Time Value
  • 将 4 个字符的字符串转换为 int32

    有没有一种快速的方法将 4 个字符转换为 32 位 int 我知道我可以像这样循环它 string key ABCD int val 0 for int i 0 i lt 4 i int b int key i int Math Pow 2
  • 如何在 Java GUI 中用鼠标光标拖动图像?

    我的代码调用目录中的 n 个图像来放置在 JPanel 上 public void imageAdder int n String name BufferedImage myPic null for int i 0 i lt n i try
  • mysql 搜索多列

    下面显示了名为 posts 的表中三列 上午 下午和晚上 的数据如何存储 假设用户想要搜索以下匹配的记录 早上 周一 周二 下午 周一 Mysql 查询必须在所有三列中搜索这些匹配的数据 我设法对单列执行此操作 例如 下午 但是如何更改我的
  • JavaScript数组长度为0

    我遇到了一些奇怪的行为 如下所示 它显示数组长度为 0 尽管在它之前打印它表明长度显然大于 0 var getTopSelection function callback var topSelection for var i 0 i lt
  • 如何设置 os x 中的应用程序使用的 $PATH

    我正在使用 ant 构建我的项目 并使用 svnversion 可执行文件将版本 ID 插入到我的源代码中 以便于跟踪版本 从命令行运行这个 ant 文件是有效的 我已经在 profile 中设置了 PATH 以包含 svnversion
  • 为 iPhone SDK 编译 Freetype (XCode)

    我想知道是否有人知道如何在 iPhone SDK 的 XCode 中配置 FreeType 我一直在尝试但没有成功 理想情况下 您需要使用最新的工具进行构建 从 iOS 6 0 SDK 版本开始 最低 SDK 版本为 4 3 并针对 arm
  • 将带有图像的 JLabel 添加到 JList 以显示所有图像

    这是我的代码 它不在框架中显示图像 而是显示一些文本 有人会建议我应该在代码中进行哪些更改 以便它允许我在框架中显示图像吗 import java awt Component import java awt Image import jav
  • 如何规范 Git 中的工作树行结尾?

    我克隆了一个行结尾不一致的存储库 我添加了一个 gitattributes它为我想要规范化的文件设置文本属性 现在 当我提交更改时 我收到消息 warning CRLF will be replaced by LF in FILE The
  • C# - 为什么这个变量在通过方法后没有被更改[重复]

    这个问题在这里已经有答案了 所以我显然对编程相当陌生 但我试图找出为什么这不起作用 我正在尝试获取字符串 myname 并将 Mr 添加到其开头 我知道我可以简单地做到这一点myname Mr myname但是我试图了解如何使用方法来更改变
  • n 组位的高效随机排列

    对于产生精确的位模式的问题n设置位 我知道两种实用的方法 但它们都有我不满意的局限性 首先 您可以枚举在预先计算的表中设置了那么多位的所有可能的字值 然后在该表中生成一个随机索引以挑选出可能的结果 这样做的问题是 随着输出大小的增长 候选输