在 .NET 中模拟 Python 的 random.choice

2023-12-21

Python 的“random”模块有一个函数random.choice http://docs.python.org/library/random.html#random.choice

random.choice(seq)
从非空序列 seq 返回一个随机元素。如果seq为空,引发IndexError.

我如何在 .NET 中模拟这一点?

public T RandomChoice<T> (IEnumerable<T> source)

编辑:几年前我在面试时听到过这个问题,但今天这个问题自然地出现在我的工作中。面试问题表述有限制

  • “序列太长,无法保存到内存中”
  • '你只能循环序列一次'
  • “序列没有长度/计数方法”(à .NET IEnumerable)

要创建一个仅迭代源一次并且不必分配内存来临时存储它的方法,您需要计算迭代了多少项,并确定当前项应该是结果的概率:

public T RandomChoice<T> (IEnumerable<T> source) {
  Random rnd = new Random();
  T result = default(T);
  int cnt = 0;
  foreach (T item in source) {
    cnt++;
    if (rnd.Next(cnt) == 0) {
      result = item;
    }
  }
  return result;
}

当您看到第一个项目时,应该使用它的概率是 1/1(因为这是您迄今为止看到的唯一项目)。当您处于第二个项目时,它应该替换第一个项目的概率是 1/2,依此类推。


这自然会使用更多的 CPU,因为它为每个项目创建一个随机数,而不仅仅是一个随机数来选择一个项目,正如 dasblinkenlight 指出的那样。您可以检查源是否实现IList<T>正如丹涛建议的那样,并使用一种实现,该实现使用以下功能来获取集合的长度并按索引访问项目:

public T RandomChoice<T> (IEnumerable<T> source) {
  IList<T> list = source as IList<T>;
  if (list != null) {
    // use list.Count and list[] to pick an item by random
  } else {
    // use implementation above
  }
}

注意:您应该考虑发送Random实例到方法中。否则,如果您调用该方法两次时间太接近,您将获得相同的随机种子,因为种子是从当前时间创建的。


测试运行的结果,从包含 0 - 9 的数组中选取一个数字 1000000 次,以显示所选数字的分布没有倾斜:

0: 100278
1: 99519
2: 99994
3: 100327
4: 99571
5: 99731
6: 100031
7: 100429
8: 99482
9: 100638
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .NET 中模拟 Python 的 random.choice 的相关文章

  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • 枚举扩展方法

    在vs2008中 是否可以编写适用于任何枚举的扩展方法 我知道您可以针对特定枚举编写扩展方法 但我希望能够使用单个扩展方法对每个枚举进行处理 这可能吗 是的 只需针对基础进行编码Enum类型 例如 public static void So
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • 引用的程序集自动由 Visual Studio 替换

    我有 2 个项目 一个可移植类库和一个常规单元测试项目 在可移植类库中 我使用 NuGet 来引用 Microsoft BCL 可移植包 它附带 2 个程序集 System Threading Tasks dll and System Ru
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • 以正确的尺寸打印 HTML5 Canvas

    是否有正确的方法来指定画布元素的尺寸 例如以毫米为单位 以便如果我将其打印出来它将具有正确的尺寸 我试过这个简单的例子
  • 输出子句 VS 触发器

    在我们的数据库中 大多数表都有一个dbupddate字段表示datetime最后的INSERT or UPDATE应用在该行 为了避免该字段有错误的值 存在触发器 有时AFTER 有时INSTEAD OF 这确保最终该值是正确的 而不是有人
  • EF 4.1 Code First 中的 XML 数据类型

    我想使用 SQL Serverxmltype 作为实体类的列类型 根据这个线程 https social msdn microsoft com Forums en US 2d6b75ee a1b7 44bf b5f3 d32b12f2db6
  • 无法连接到 Elasticsearch(通过 Curl)

    我最近安装了 Elasticsearch 前几天一切都运行良好 但不知何故今天它停止工作了 当我启动服务时 它声称没问题 sudo etc init d elasticsearch start Starting Elasticsearch
  • 如何强制mysql UPDATE查询使用索引?如何让mysql引擎自动使用索引而不是强制使用索引?

    下面是不使用最近创建的复合索引的更新查询 查询计划 解释表明它没有使用名为的复合索引radacctupdate我认为这将使更新查询更快 表上还有其他索引可供其他查询使用 EXPLAIN UPDATE radacct SET acctstop
  • 如何在Scheme中列出评估的所有中间步骤

    例如 如果有表达式 map lambda x add1 x 1 2 3 其评估结果为 2 3 4 如何显示所有中间步骤 在本例中为 map lambda x add1 x 2 2 3 map lambda x add1 x 2 3 3 我认
  • 每次调试运行时禁用辅助服务

    每次启动新的调试实例时 我的辅助功能服务都会重置为禁用状态 有什么方法可以在连续的调试运行中保持启用它 因为每次启用它以调试服务是相当漫长且无聊的 我在真实设备和模拟器上有相同的行为 服务中没有异常 我尝试了事件处理程序中没有代码的事件 我
  • 在编译库中查找 System.gc()

    我在 gc 日志中看到显式的 gc 调用 见下文 我可以使用 XX DisableExplicitGC 删除调用 但我真的想知道哪个代码 库正在调用System gc 关于如何追踪它有任何提示吗 2011 05 30T12 21 48 23
  • 有哪些好的 java make 实用程序?

    我正在寻找一个用于构建大型 java 程序的 make 实用程序 我已经知道 ANT 但想看看还有什么可用的 理想情况下 它应该能够处理导致 GNU Make 混乱的 java gt class 包目录怪异现象 Win32 但跨平台是一个优
  • Rails:对渲染视图进行后处理

    某些 Rails 应用程序会生成一个视图 其中显示有关资源的一些信息 我想通过插件抑制一些信息 而不改变或覆盖视图 一种可能的方法是重写插件中的视图 但这可能会干扰其他插件 我不希望这样 有没有办法修改控制器 以便生成的视图在发送到客户端之
  • 如何检测flutter应用程序何时从后台返回?

    我想检测扑动应用程序何时从后台返回 在其他跨App开发的SDK中 当应用程序更改此状态时 通常会有一个监听器 flutter中有类似的东西吗 class AppState extends State
  • HTTP 标头中的 unicode 用户代理合法吗?

    我正在维护的一个应用程序将从 Web 日志中提取的用户代理加载到使用 latin1 字符集的 MySQL 表列中 有时 它无法加载如下所示的用户代理 Mozilla 5 0 I CPU iPhone OS 5 0 1 like Mac OS
  • UIImageView.appearance 覆盖 UISegmentedControl.appearance

    我一直在尝试使用外观代理 API 将一些默认颜色应用于某些控件 但遇到了问题 当我应用色调颜色时UISegmentedControl使用类似 UISegmentedControl appearance tintColor UIColor r
  • Qt:如何获取当前正在运行的窗口?

    我正在编写一个模拟按键的测试应用程序 我想了解每次按键后显示的窗口 这是代码块 std auto ptr
  • Colorbar - Matlab 中的轴刻度

    我正在使用下面的代码 d3 vals n datesmonth figure plot n d3 colormap jet 12 hold on plot n d3 b scatter n d3 RiskierInd filled caxi
  • React Native iOS 有效登录后“Safari 无法打开页面,因为地址无效”

    登录成功后得到如下信息 登录流程在 Android 上按预期工作 并正确返回令牌 刷新等 Safari 无法打开页面 因为地址无效 错误屏幕录制 https i stack imgur com N5esc gif Auth0 Callbac
  • 单一案例歧视工会的目的

    我正在定义一个单子可观察 反应式解析器 这与普通解析器的行为完全不同 因为它是连续查询 底层类型是 IObservable lt a gt gt IObservable lt b gt 从函数式语言中的各种解析器实现来看 似乎定义事物的更合
  • 声纳错误条件不应无条件评估为“TRUE”或“FALSE”

    我遇到声纳违规 条件不应无条件评估为 TRUE 或 FALSE 对于下面的代码 List
  • 将 LESS 嵌套 CSS 转换为标准 CSS

    我需要帮助尝试将这种 LESS 嵌套 CSS 转换为标准 CSS 有人可以帮忙吗 leftNav a TopLevel float none ul topnav gt li float none height 2em margin 2px
  • 在 .NET 中模拟 Python 的 random.choice

    Python 的 random 模块有一个函数random choice http docs python org library random html random choice random choice seq 从非空序列 seq