随机排列

2024-05-26

我无法找到一种随机洗牌元素的好方法std::vector经过一些操作后,恢复原来的顺序。我知道这应该是一个相当简单的算法,但我想我太累了......

由于我被迫使用自定义随机数生成器类,我想我不能使用std::random_shuffle,无论如何这没有帮助,因为我还需要保留原始顺序。所以,我的方法是创建一个std::map它充当原始位置和随机位置之间的映射,如下所示:

std::map<unsigned int, unsigned int> getRandomPermutation (const unsigned int &numberOfElements)
{
    std::map<unsigned int, unsigned int> permutation;

    //populate the map
    for (unsigned int i = 0; i < numberOfElements; i++)
    {
        permutation[i] = i;
    }

    //randomize it
    for (unsigned int i = 0; i < numberOfElements; i++)
    {
        //generate a random number in the interval [0, numberOfElements)
        unsigned long randomValue = GetRandomInteger(numberOfElements - 1U);

        //broken swap implementation
        //permutation[i] = randomValue;
        //permutation[randomValue] = i;

        //use this instead:
        std::swap(permutation[i], permutation[randomValue]);
    }

    return permutation;
}

我不确定上述算法是否是随机排列的正确实现,因此欢迎任何改进。

现在,以下是我如何利用这个排列图:

std::vector<BigInteger> doStuff (const std::vector<BigInteger> &input)
{
    /// Permute the values in a random order
    std::map<unsigned int, unsigned int> permutation = getRandomPermutation(static_cast<unsigned int>(input.size()));

    std::vector<BigInteger> temp;

    //permute values
    for (unsigned int i = 0; i < static_cast<unsigned int>(input.size()); ++i)
    {
        temp.push_back(input[permutation[i]]);
    }

    //do all sorts of stuff with temp

    /// Reverse the permutation
    std::vector<BigInteger> output;
    for (unsigned int i = 0; i < static_cast<unsigned int>(input.size()); ++i)
    {
        output.push_back(temp[permutation[i]]);
    }

    return output;
}

有些东西告诉我我应该只能使用一个std::vector<BigInteger>对于这个算法,但是,现在,我无法找出最佳解决方案。老实说,我不太关心其中的数据input,所以我什至可以将其设为非常量,覆盖它,并跳过创建它的副本,但问题是如何实现该算法?

如果我做了这样的事,我最终会搬起石头砸自己的脚,对吗? :)

for (unsigned int i = 0; i < static_cast<unsigned int>(input.size()); ++i)
{
    BigInteger aux = input[i];
    input[i] = input[permutation[i]];
    input[permutation[i]] = aux;
}

EDIT:继史蒂夫关于使用“Fisher-Yates”洗牌的评论后,我改变了我的想法getRandomPermutation相应地发挥作用:

std::map<unsigned int, unsigned int> getRandomPermutation (const unsigned int &numberOfElements)
{
    std::map<unsigned int, unsigned int> permutation;

    //populate the map
    for (unsigned int i = 0; i < numberOfElements; i++)
    {
        permutation[i] = i;
    }

    //randomize it
    for (unsigned int i = numberOfElements - 1; i > 0; --i)
    {
        //generate a random number in the interval [0, numberOfElements)
        unsigned long randomValue = GetRandomInteger(i);

        std::swap(permutation[i], permutation[randomValue]);
    }

    return permutation;
}

如果您要“随机化”一个包含 n 个元素的向量,则可以创建另一个std::vector<size_t> index(n), set index[x] = x for 0 <= x < n,然后随机播放index。然后您的查找采用以下形式:original_vector[index[i]]。原始向量的顺序从未改变,因此无需恢复顺序。

...受限于使用自定义随机数生成器类,我想我不能使用std::random_shuffle...

您注意到这种超载了吗?

template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
                    RandomNumberGenerator& rand );

有关如何使用兼容对象包装随机数生成器的详细信息,请参阅http://www.sgi.com/tech/stl/RandomNumberGenerator.html http://www.sgi.com/tech/stl/RandomNumberGenerator.html

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

随机排列 的相关文章

随机推荐

  • 如何在PropertyGrid中自定义绘制GridItem?

    我想以与所有者在 ListView 详细信息 和其他控件中绘制项目类似的方式在 PropertyGrid 中绘制属性值 如果将属性声明为 Color 类型 则其值将使用字符串描述旁边的颜色样本来绘制 如果属性是图像类型 则在字符串描述旁边绘
  • SQL 执行计划是基于架构还是数据,或者两者兼而有之?

    我希望这个问题不太明显 我已经找到了很多关于解释执行计划的好信息 但有一个问题我还没有找到答案 该计划 更具体地说是相对 CPU 成本 仅基于架构 还是数据库中当前的实际数据 我尝试对我的产品数据库中需要索引的位置进行一些分析 但正在使用我
  • 识别左侧由 delta 链接的簇,右侧由不同 delta 链接的簇

    考虑排序后的数组a a np array 0 2 3 4 5 10 11 11 14 19 20 20 如果我指定了左增量和右增量 delta left delta right 1 1 这就是我期望的集群分配方式 a 0 2 3 4 5 1
  • 如果满足条件,Angular JS 如何添加 CSS 类

    我正在创建一个截断指令 如果字符超过 10 我就会截断文本字符串 然后它将显示 我的目标是编写一个条件 如果字符少于 10 个 则删除 如果有人对我如何实现此目标有任何想法 我会坚持这一点并接受建议 这是我的代码 var app angul
  • 从 HTML 文件输入中删除“所有文件”选项

    我在用
  • 如何让 JQuery UI 自动完成与项目 id 配合使用

    我在这里看到了这篇文章 带有项目和 ID 的 jQuery UI 自动完成 https stackoverflow com questions 4815330 jquery autocomplete with item and id但我无法
  • Apache Beam:如何在使用重复数据删除功能时解决“ParDo 需要确定性密钥编码器才能使用状态和计时器”

    我正在尝试使用 Apache Beam 的重复数据删除功能对来自 Google Cloud Pubsub 的输入消息进行重复数据删除 但是 我创建后遇到错误KV
  • 替换 XSLT 中的特殊字符

    我想从 XSLT 中的字符串中删除字母以外的字符 例如
  • 如何在浏览时检查客户端是否安装了 SQLNCLI10 提供程序?

    我有一个 C 网站 允许客户端从其 PC 直接连接到远程 SQL Server 数据库 通过使用第 3 方 ActiveX 控件绕过 Web 服务器 我最初使用的是SQLOLEDB提供商并且运行良好 客户端位于内部网络中 使用 Window
  • 创建由线连接的 CSS3 圆圈

    我必须在 CSS 中实现以下圆形和线条组合 并且我正在寻找有关如何有效实现此功能的指示 圆圈和线条应如下所示 我能够这样实现圆圈 span step background ccc border radius 0 8em moz border
  • https登录的安全性?

    我正在编写一个 Apple iOS 应用程序 用于登录帐户并获取一些余额 它使用纯 html 链接进行登录 用户名和密码在运行时动态加载到登录链接 我使用 Wireshark 嗅探了流量 但在发送的任何包中都找不到用户名或密码 我猜 htt
  • 直接从表中选择和视图之间的区别

    直接从表中选择数据或从视图中选择数据有什么区别 每一种的最佳用途是什么 根据微软的说法 如果你使用的话会有性能优势indexedSQL Server 2000 2005 2008 中的视图 索引视图可以通过以下方式提高查询性能1 可以预先计
  • onLocationChanged 回调是在哪个线程上进行的?主 UI 线程?

    当在我的应用程序中进行此回调时 我有相当多的工作要做 通过 ORM 库和一些基于距离的计算读取和写入 SQL 数据库 当然 我担心不会阻塞主 UI 线程 因此我一直在尝试 未成功 找出这是否是进行回调的线程 如果是 我打算在回调发生时触发的
  • Python - 函数无法在新线程中运行

    我正试图杀死notepad exe使用此函数在 Windows 上进行处理 import thread wmi os print CMD Kill command called def kill c wmi WMI Commands not
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 为什么 `Pool.map()` 多处理中的内存消耗急剧增加?

    我正在对 pandas 数据帧进行多重处理 方法是将其拆分为多个数据帧 这些数据帧存储为列表 并且 使用Pool map 我将数据帧传递给定义的函数 我的输入文件约为 300 mb 因此小数据帧大约为 75 mb 但是 当多处理运行时 内存
  • 为什么.net中的数组只实现IEnumerable而不实现IEnumerable

    我正在实现自己的 ArrayList 类 当我意识到这一点时 我感到很惊讶 public System Collections Generic IEnumerator
  • 加载远程图像

    在 Android 中 最简单的方法是什么 从远程服务器加载图像 将其显示在 ImageView 中 这是我在应用程序中实际使用的方法 我知道它有效 try URL thumb u new URL http www example com
  • 读取文件而不从操作系统页面缓存中逐出

    这主要适用于 Linux 或者理想情况下适用于任何 POSIX 系统 当我阅读以下页面时 我正在寻找一种读取大量文件 其中任何一个文件本身可能高达 1GB 的方法 具有以下特征 如果相关磁盘页面已在文件系统缓存中 则使用该页面 如果相关页面
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮