编写一个 c 函数,在给定特定范围的情况下生成一个随机数、一对随机数或一组随机数

2023-12-02

我必须为 3 种不同的情况生成随机数。 我。 1 个骰子 二.一对骰子 三. 3 个骰子 我的问题: 1.请建议我为所有 3 种情况生成随机数的良好逻辑。 2.当我考虑2个骰子而不是1个骰子的cses时,逻辑会改变吗? 3.我们生成随机数的范围对随机函数的逻辑有多大影响?


如果范围足够小,那么使用通常的取模方法应该不会有问题

int GetRandomInt(int Min, int Max)
{
    return (rand()%(Max-Min+1))+Min;
}

(where Min a Max指定一个闭区间,[Min, Max])

每掷一次骰子就调用一次。别忘了打电话srand(time(NULL))在应用程序开始时(在开始时only,而不是每次您想要获得随机数时)来为随机数生成器提供种子。

如果范围开始变大,您可能不得不面临两个问题:

一、范围rand()显然不是 [0, +∞),而是 [0,RAND_MAX], 在哪里RAND_MAX is a #define保证至少为 32767。如果你的范围 (Max-Min) 跨越RAND_MAX,那么,使用此方法,您将得到一些返回概率为零的数字。

这更微妙:假设RAND_MAX比你的范围大,但不是that更大,让我们这么说RAND_MAX==1.5*/(Max-Min)。 在这种情况下,结果的分布不会均匀:rand()返回 [0,RAND_MAX] (并且此范围内的每个整数应该是等概率的),但是您将使用剩余的除法(Max-Min)。这意味着所需范围前半部分的数字被返回的概率是其他数字的两倍:它们实际上可以来自第一个and第三个三分之一的rand()范围,而所需范围的后半部分只能来自第二个三分之一rand() range.

这对你来说意味着什么?

可能什么也没有。如果您想做的只是一个掷骰子模拟器,那么您可以使用取模方法而不会出现任何问题,因为涉及的范围很小,而第二个问题尽管是still目前,这几乎是无关紧要的:假设你的范围是 3 并且MAX_RAND32767:从 0 到 32765,0、1 和 2 具有相同的概率,但上升到 32767 0 和 1 获得一个潜在的退出,这几乎是无关紧要的,因为它们是从完美的 1/3 (10922/32766=0,333 ...) 每个 1 的概率为 2 (~0,33332) 的 10922/32767 和 0 和 1 的 10923/32767 (~0,33335)(假设rand()提供了一个perfect分配)。

总之,为了克服这些问题,一个常用的方法是“拉伸”rand()使用如下方法将范围扩展到更广泛的范围(或将其压缩到更小的范围):

int GetRandomInt(int Min, int Max)
{
    return (int)(((double)rand())/MAX_RAND*(Max-Min))+Min;
}

基于等价性rand():MAX_RAND=X:(Max-Min)。转换为 double 是必要的,否则之间的整数除法rand()并且它的最大值将始终产生 0(或者在极少数情况下产生 1)rand()==MAX_RAND);如果 MAX_RAND 很小并且范围也不是太宽,可以用整数运算来先执行乘积,否则溢出的风险很高。

我怀疑,如果输出范围大于rand(),“拉伸”和 fp 值截断(由于转换为 int)以某种方式影响分布,但只是局部影响(例如,在小范围内,您可能永远不会得到某个数字,但全局分布看起来不错)。

请注意,此方法有助于克服 C 标准库随机数生成器的分散限制,即返回值的低位随机性较低 - 顺便说一句,这些位是您在执行模运算时使用的那些输出范围小。

然而,请记住,C 标准库 RNG 是一个简单的库,它努力遵守“简单”的统计规则,因此很容易预测;当需要“严重”随机数时(例如密码学),不应该使用它。对于此类需求,有专门的 RNG 库(例如RNG partGNU 科学图书馆),或者,如果您需要really随机的东西,有几个real随机数服务(最著名的之一是this),它不使用数学伪 RNG,而是从真实的随机源(例如放射性衰变)获取数字。

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

编写一个 c 函数,在给定特定范围的情况下生成一个随机数、一对随机数或一组随机数 的相关文章

  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • php检查数组中的多个日期是否在日期范围内

    我有一个结构如下的数组 Array 0 gt 24 12 2013 1 gt 25 12 2013 2 gt 26 12 2014 3 gt 27 12 2013 4 我想检查数组中的任何日期是否在给定的日期范围内 日期范围的结构如下 st
  • 我可以隐藏 UIDocumentInteractionController 视图上的操作按钮吗?

    我想知道是否可以隐藏 UIDocumentInteractionController 上的操作按钮 以便用户实际上无法在另一个应用程序中打开文档 我发现了一些对我来说足够有效的东西 BOOL documentInteractionContr
  • 如何设置自定义小部件的背景颜色和边框宽度?

    我有一个自定义小部件 其父级是另一个自定义小部件 我可以使用设置父自定义小部件的背景颜色QPalette而且效果很好 但我无法使用两者来设置子自定义小部件的边框颜色QPalette and stylesheet 这就是我设置父自定义小部件背
  • 使用 Azure Ad 中的服务应用程序限制对组或单个邮箱的访问

    我有一个 Azure 集成服务应用程序 守护程序应用程序 具有 Microsoft graph api 的权限 我现在可以读取整个公司的所有邮箱 这很棒 但可能会引起业务管理方面的一些担忧 我们在 Office 365 中使用 Outloo
  • StructureMap HowTo:深层对象的条件构造

    我很难有条件地创建依赖关系 谷歌搜索 我还没有找到使用 BuildStack 和条件谓词的好例子 这是我在注册表中所做的事情 snip public SomeRegistry this InstanceOf
  • 有什么可能的方法从 UIViewcontroller 类调用 drawRect 吗?

    我有一个UIViewController类称为AppController h AppController m 我在那里有数千行代码 这是我在询问之前没有测试它的唯一原因 有没有可能的方法来使用drawRect in a UIViewCont
  • 提高 Get-FileMetaData 的速度

    我目前正在使用以下来自 scriptingguys com 的脚本 这一切都归功于他们 我只是添加了最后两行 它需要一个目录并从文件的元数据中提取文件路径和注释字段 目前该脚本需要 1 5 分钟多一点才能完全运行 有没有办法加快速度或使用不
  • 按电源按钮启动应用程序

    我找到了这个code按电源按钮启动应用程序 我不知道为什么这个代码对我不起作用 但无论如何我正在将一些代码与清单一起放置 请检查 然后告诉我通过按一次或两次电源按钮启动应用程序的代码是否正确 toast Toast makeText get
  • 正则表达式根据之前匹配的内容来匹配某些内容

    我正在尝试编写一个正则表达式来验证移动国际象棋代数记数法 这是我到目前为止所拥有的 O O O Castling KQRBN x a h 1 8 Most normal moves and captures 我迷失的地方是典当促销 马 主教
  • SwingFXUtils 图像序列化替代方案(Javafx、Swing、Raspberry Pi)

    我的 JavaFX 应用程序的用例之一是在一侧加载图像 通过 TCP 套接字对其进行序列化 以在另一侧将其显示为 JavaFX 图像 为了实现这个我正在使用SwingFXUtils fromFXImage and SwingFXUtils
  • Angular 2 + 如何使用相同的选择器选择和循环多个元素(elementRef.nativeElement)

    在我的组件中 我尝试取消选择具有相同类名的所有复选框 querySelector每次 或一次 仅选择第一个 并且querySelectorAll不选择任何内容 这就是函数 我知道这样使用 jQuery 是错误的 但它说明了我的目标 unse
  • C 套接字发送 UDP 并处理来自路由器的 ICMP 回复

    我正在尝试向生存时间为 1 的路由器发送 UDP 数据包 然后接收 ICMP 超时回复 到目前为止 我能够发送数据包 但是当我的程序到达执行的接收部分时 它就挂起了 我对recvfrom进行了错误检查 但它甚至没有达到这一点 我的计算机正在
  • 在匹配中返回 Result>

    我有一组实现给定特征的类型 我想从字符串名称中获取具体类型对象 奇怪的是 当我的match回报Box
  • 目标 c 中 didload 方法启动时的 LandscapeOrientation

    我做了一个iPad应用程序 当我第一次以纵向模式加载应用程序时 它工作正常 但是当我第一次以横向模式加载应用程序时 它仅采用纵向模式的坐标 因为在我的内部didLoad方法我只给出纵向模式的坐标 现在需要给出我的横向模式的坐标didLoad
  • Docker 无法启动 Rails

    我正在尝试使用 Rails 启动我的 Rails 应用程序 它依赖于redis 它似乎可以工作 但是当rails服务器启动时它会失败Cannot assign requested address connect 2 for 1 6379 E
  • GetFileVersionInfo() 返回错误的文件版本信息

    我有一个应用程序需要检查各种系统 EXE 和 DLL 的版本以确定它们是否容易受到攻击 这是一个本机 C 应用程序 在其清单中不提供任何特定的 WinSxS 链接 在 Windows 7 上 当我在绝对路径 例如 c windows sys
  • 编写函数将某些列更改为小写

    我正在尝试编写一个函数 该函数允许我将数据框中某些字段的大小写更改为小写 我试图通过使用 function for 和 tolower 命令来做到这一点 但我没有任何运气 我对 R 还很陌生 所以我可能会遗漏一些明显的东西 我将不胜感激任何
  • 将具有动态高度的 div 移出其父容器

    我正在尝试将高度动态变化的 div 移出其父 div 并返回 问题是动态高度 否则我可以轻松地将负高度设置为底部值 现在我只是将一个很大的负数像素设置为底部值 但这不是很好 也不能正确解决问题 从逻辑上讲 这种情况发生在少数人身上 fidd
  • 这个计算每个元音出现次数的 C 程序有什么问题?

    PROBLEM 编写一个 C 程序 提示用户输入一串以 ENTER 键结尾的字符 即 n 然后统计该字符串中每个元音出现的总数 您的程序应遵循以下准则 你的程序应该声明一个由5个整型计数器组成的数组 即counter 使用循环 您的程序应将
  • 编写一个 c 函数,在给定特定范围的情况下生成一个随机数、一对随机数或一组随机数

    我必须为 3 种不同的情况生成随机数 我 1 个骰子 二 一对骰子 三 3 个骰子 我的问题 1 请建议我为所有 3 种情况生成随机数的良好逻辑 2 当我考虑2个骰子而不是1个骰子的cses时 逻辑会改变吗 3 我们生成随机数的范围对随机函