洗牌所需的 IEnumerable 的扩展方法[重复]

2023-12-11

我需要一个扩展方法来洗牌IEnumerable<T>。它还可以采取int指定返回的大小IEnumerable。更好地保持不变性IEnumerable。我目前的解决方案IList-

public static IList<T> Shuffle<T>(this IList<T> list, int size)
{
    Random rnd = new Random();
    var res = new T[size];

    res[0] = list[0];
    for (int i = 1; i < size; i++)
    {
        int j = rnd.Next(i);
        res[i] = res[j];
        res[j] = list[i];
    }
    return res;
}

public static IList<T> Shuffle<T>(this IList<T> list)
{ return list.Shuffle(list.Count); }

您可以使用Fisher-Yates-Durstenfeld 洗牌。无需显式地将大小参数传递给方法本身,您只需添加对Take如果您不需要整个序列:

var shuffled = originalSequence.Shuffle().Take(5);

// ...

public static class EnumerableExtensions
{
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
    {
        return source.Shuffle(new Random());
    }

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
    {
        if (source == null) throw new ArgumentNullException(nameof(source));
        if (rng == null) throw new ArgumentNullException(nameof(rng));

        return source.ShuffleIterator(rng);
    }

    private static IEnumerable<T> ShuffleIterator<T>(
        this IEnumerable<T> source, Random rng)
    {
        var buffer = source.ToList();
        for (int i = 0; i < buffer.Count; i++)
        {
            int j = rng.Next(i, buffer.Count);
            yield return buffer[j];

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

洗牌所需的 IEnumerable 的扩展方法[重复] 的相关文章

  • 输出 objdump -t 的输出中的“.hidden”是什么意思?

    Example objdump Logger cpp o t 00000000 g F text 00000000 hidden sti 10 Logger cpp 0b2ae32b 这意味着符号的可见性被隐藏 https develope
  • 返回带有列表对象的列表对象

    我有三个表 汽车品牌 汽车型号 和 CarsandModel 我有 Carsand 模型表 因为一个模型可以由多个制造商构建 我想返回包含汽车型号列表的汽车品牌列表 我现在的长篇大论不是过滤汽车型号的汽车制造商列表 我尝试添加一个 wher
  • 如何将 int.TryParse 与可为空的 int 一起使用? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 TryParse 来查找字符串值是否为整数 如果该值为整数 则跳过 foreach 循环 这是我的代码 string strValue 42 if int TryParse trim strVal
  • 清理 STL 指针列表/向量

    您可以想出的最短的 C 块是多少来安全地清理std vector or std list指针 假设您必须对指针调用删除 list
  • 如何使用 Unity 动态注册通用类?

    我有一个包含很多类 300 和 BaseClass 的程序集 我想用接口注册一个泛型类 统一后 您必须在 Name如果你想解析接口的对象数组 我想要一个对象数组主视图模型自动地 有没有办法通过反射来自动执行此操作 有什么建议么 示例 伪 p
  • 是否可以将 CMFCToolBar 添加到对话框中?

    我刚刚尝试了将 CToolbar 添加到新 CMFCToolBar 上的对话框的标准方法 但这不起作用 在我深入研究新的实现之前 我想知道它是否真的可行 我不确定你所说的 标准方式 是什么意思 但你当然可以以编程方式做到这一点 In MyD
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • 如何用C语言创建字典?

    我正在用 C 语言编写一个微控制器 作为它的一部分 我想在 7 段显示器上显示某些字母 每个字母都有一个对应的数字 使 7 段显示屏显示该字母 它没有真正的模式 因为数字只是通过将显示字母所需的 7 段显示器上的位相加而成 因此如果我可以创
  • 在.NET MVC中,有没有一种简单的方法来检查我是否在主页上?

    如果用户从主页登录 我需要采取特定的操作 在我的 LogOnModel 中 我有一个隐藏字段 Html Hidden returnUrl Request Url AbsoluteUri 在我的控制器中 我需要检查该值是否是主页 在下面的示例
  • 将图像添加到 ASP.Net 中的单选按钮列表

    我正在尝试将图像添加到单选按钮列表控件 但它不起作用 我试过这个 RadioButtonList2 Items Add new ListItem String Format src Colors Dallas 625527 1 1 png
  • if(pointerVar) 与 if(pointerVar!=NULL) 相同吗?

    简单的问题 Is if pointerVar 与if pointerVar NULL 也是if pointerVar 与if pointerVar NULL 给我你在技术上最正确 迂腐的答案 这两种说法看起来和操作起来都是一样的 前者有什么
  • 我们还需要迭代器设计模式吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 黑屏只是闪烁一会儿

    在我的 Windows Phone 8 应用程序中 我有一个搜索页面 其中有一个文本框供用户输入搜索关键字 输入默认SIP键盘的 Enter 键时将调用搜索 搜索结果显示在另一个页面中 为了在导航到结果页面之前隐藏键盘 我使用 this F
  • 无法在 Visual Studio Code 的 C# 输出上键入任何内容

    所以我试图在 vscode 上运行一个非常基本的 C 程序 代码如下 using System namespace HelloWorld class Program static void Main string args string N
  • Web Api 2 在 OWIN 中间件中获取控制器和操作名称?

    如何在自定义 OWIN 中间件中检索 api 控制器名称和 api 操作名称 我可以在消息处理程序内部执行此操作 如下所示 var config request GetConfiguration var routeData config R
  • 如果未先将 lambda 表达式强制转换为委托或表达式树类型,则无法将其用作动态分派操作的参数

    我正在使用 NET4 5 和 VS2013 我有这个查询dynamic来自数据库的结果 dynamic topAgents this dataContext Sql select t create user id as User sum t
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • Windows 中的蓝牙 AVRCP 命令会触发哪些事件

    可以这么说 只是在做一些高级侦察 对于我的潘多拉客户 Elpis http elpis adamhaile net 我支持全局媒体键 键盘上的 MediaPlayPause MediaNext 等 并且我希望能够支持AVRCP http e
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧
  • 为什么删除void*是UB而不是编译错误?

    为什么要通过删除对象void 是未定义的行为 而不是编译错误 void foo void p delete p 这段代码编译并生成代码 尽管有关于 gcc 和 clang 的警告 令人惊讶的是 ICC 没有给出警告 2 5 warning

随机推荐

  • Java 中的互斥量和信号量是什么?主要区别是什么?

    Java 中的互斥量和信号量是什么 主要区别是什么 不幸的是 每个人都忽略了信号量和互斥体之间最重要的区别 的概念 所有权 信号量没有所有权的概念 这意味着任何线程都可以释放信号量 这本身可能会导致许多问题 但有助于 死亡检测 而互斥体确实
  • 在 C/C++ 中写入非打印字符的行为是什么?

    如果字符是通过写入的 则写入非打印字符的行为是否未定义或实现定义printf fprintf 我很困惑 因为 C 标准 N1570 5 2 2 中的单词只讨论打印字符和字母转义序列的显示语义 另外 如果字符是通过写的呢 std ostrea
  • 检测SD卡硬件驱动器盘符

    有没有办法在 Windows 上以编程方式检测 SD 卡的驱动器盘符 该方法是否支持内部和外部 SD 卡硬件 感谢您的时间 你可以试试获取逻辑驱动器字符串获取驱动器号 然后使用获取驱动器类型查看驱动器是否可移动 然后您可以获得更多的设备信息
  • RSelenium 和 Javascript

    我对 R 相当精通 但对 javaScript 和其他语言完全一无所知 我想访问有关此公开数据集的信息 http fyed elections on ca fyed en form page en jsp 特别是 我在数据框中有一个包含数千
  • JQuery限制两个日期选择器之间的差异

    我有 2 个日期选择器 function DateFrom datepicker onSelect showUser minDate 90 maxDate 1D function DateTo datepicker onSelect sho
  • 如何使用 Spring MVC 和多种响应类型支持 JSONP

    我在控制器中有一个方法 它将根据要求返回 HTML 或 JSON 这是这种方法的一个精简示例 根据我在中找到的有关如何执行此操作的信息进行建模这个问题 RequestMapping value callback public ModelAn
  • 无法在 Jupyter Notebook 中导入 Tensorflow

    我尝试在 conda 环境中的 Jupyter 笔记本中导入 Tensorflow 模块 但出现以下错误 AttributeError type object h5py h5 H5PYConfig has no attribute redu
  • Unity3D - 在 Android 上接到任何呼叫/通知后音频播放变得静音

    我在 Android 版本上遇到音频播放问题 我使用的是 Unity 5 4 0b15 但我在 5 3 4p3 上遇到了同样的问题 我在场景中的 AudioPlayer 游戏对象中添加了用于播放背景音乐的简单组件 public AudioC
  • AS3中的实时更新和推送数据

    我想对我的 Flash 应用程序进行实时更新 我更喜欢推送技术 而不是每 30 秒刷新一次 在 Actionscript 3 中推送数据的最佳方式是什么 有两种流行的实现实时更新的选项 套接字和 RTMP 每种方法都有优点和缺点 但主要决定
  • 使用 JasperReports API 在代码中出现“java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory”

    我正在开发一个简单的独立桌面应用程序 它将根据传递给程序的值生成报告 没有数据库使用 我已经使用 iReport 设计器设计了 JasperReports 报表并添加了一个参数ID NO和一个带有表达式的文本字段 P ID NO 我可以成功
  • 无法修改全局 int,但可以修改列表。如何?

    列表 VAR1 0 def foo VAR1 1 返回VAR1 通话中foo 我收到此错误 UnboundLocalError local variable VAR1 referenced before assignment 但是 请考虑该
  • 陷阱标志(TF)和监视器陷阱标志之间的区别?

    像 GDB 这样的调试功能通过设置 eflags 寄存器的 TF 标志来工作 这会在处理器每次执行指令后引发异常 让 gdb 等工具控制调试 当我们运行虚拟机 Ex 时 在 kvm 的情况下执行以下操作同样 您需要设置一个名为 MONITO
  • 如何从表中选择所有列以及 ROWNUM 等其他列?

    在Oracle中 可以做一个SELECT将行号作为结果集中的列返回的语句 例如 SELECT rownum column1 column2 FROM table returns rownum column1 column2 1 Joe Sm
  • 如何使CSS平滑过渡

    我怎样才能得到像这样的CSS转换示例here 下拉示例 到目前为止 我已经成功地只更改了文本和背景颜色 但没有更改整个过渡效果 矩形在悬停时滚动 在未悬停时平滑回滚 知道我该如何做吗 实现这一目标 这是我的代码 a menulink tex
  • 使用多处理进行日志记录

    我确实有以下内容logger类 如 logger py import logging logging handlers import config log logging getLogger myLog def start Function
  • android:如何测量智能手机产生的流量?

    我需要监控哪些服务 应用程序为我的手机产生了哪些流量 以 kbit s 为单位 按上行链路和下行链路分隔 我该怎么做呢 我用谷歌搜索但没有找到任何有用的帖子 操作方法 答案是 TrafficStats 类 在这里 您可以获得传输的字节和 或
  • C#:设置工具提示气球中箭头的位置?

    是否可以更改气球工具提示中箭头 茎的位置 更改的原因是因为位于屏幕顶部的按钮应该在其下方有一个工具提示 已删除损坏的图像链接 上面是现在的情况 我只需要箭头位于气球的左上角即可 我使用 InteropServices 调用多个 User32
  • 错误:安装 wx 时为 wxpython-phoenix 构建轮子失败

    我正在尝试安装 wxpython 我有 python 3 5 2 32Bit 和 Windows 10 64Bit 我试过 pip install wx我得到 Failed Building Wheel for wxpython phoen
  • 如何控制引导轮播在项目中滑动的速度?

    我看到你可以设置间隔 但我想控制项目滑动的速度 Sets interval what is transition slide speed mainCarousel carousel interval 3000 速度无法通过 API 控制 尽
  • 洗牌所需的 IEnumerable 的扩展方法[重复]

    这个问题在这里已经有答案了 我需要一个扩展方法来洗牌IEnumerable