在整个范围内均匀生成随机数

2023-11-25

我需要在指定的间隔 [max;min] 内生成随机数。

此外,随机数应该均匀分布在区间内,而不是位于特定点。

目前我生成为:

for(int i=0; i<6; i++)
{
    DWORD random = rand()%(max-min+1) + min;
}

根据我的测试,随机数仅在一个点周围生成。

Example
min = 3604607;
max = 7654607;

生成的随机数:

3631594
3609293
3630000
3628441
3636376
3621404

从下面的答案来看:好的,RAND_MAX 是 32767。我在 C++ Windows 平台上。还有其他方法可以生成均匀分布的随机数吗?


Why rand是个坏主意

您在这里得到的大多数答案都利用了rand函数和模运算符。那个方法可能无法统一生成数字(这取决于范围和值RAND_MAX),因此不鼓励。

C++11 和一定范围内的生成

随着 C++11 的出现,出现了多种其他选项。其中一个非常适合您的要求,可以很好地生成一定范围内的随机数:std::uniform_int_distribution。这是一个例子:

#include <iostream>
#include <random>
int main()
{    
    const int range_from  = 0;
    const int range_to    = 1000;
    std::random_device                  rand_dev;
    std::mt19937                        generator(rand_dev());
    std::uniform_int_distribution<int>  distr(range_from, range_to);

    std::cout << distr(generator) << '\n';
}

Try it online on Godbolt

And here'是正在运行的示例。

模板功能可能会有所帮助:

template<typename T>
T random(T range_from, T range_to) {
    std::random_device                  rand_dev;
    std::mt19937                        generator(rand_dev());
    std::uniform_int_distribution<T>    distr(range_from, range_to);
    return distr(generator);
}

其他随机生成器

The <random> header提供无数其他具有不同类型分布的随机数生成器,包括伯努利分布、泊松分布和正态分布。

如何洗牌容器?

该标准规定std::shuffle,可以按如下方式使用:

#include <iostream>
#include <random>
#include <vector>
int main()
{    
    std::vector<int> vec = {4, 8, 15, 16, 23, 42};
 
    std::random_device random_dev;
    std::mt19937       generator(random_dev());
 
    std::shuffle(vec.begin(), vec.end(), generator);
    std::for_each(vec.begin(), vec.end(), [](auto i){std::cout << i << '\n';});
}

Try it online on Godbolt

该算法将以线性复杂度随机重新排序元素。

增强随机

如果您无法访问 C++11+ 编译器,另一种选择是使用增强随机。它的界面与 C++11 非常相似。

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

在整个范围内均匀生成随机数 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 如何通过从字母数字字符中采样来创建随机字符串?

    我尝试编译以下代码 extern crate rand 0 6 use rand Rng fn main rand thread rng gen ascii chars take 10 collect
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p

随机推荐

  • Crashlytics iOS - 第 0 行崩溃 - Swift 源

    我目前在某些 Swift 源文件发生崩溃时遇到问题 事实上 在 Crashlytics 上我有一个关于线路和崩溃原因的奇怪信息 它告诉我源已经崩溃了line 0它给了我一个SIGTRAP错误 我读到当线程遇到断点时会发生此错误 但问题是 当
  • System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity 的奇怪问题

    我们正在编写一个系统 允许用户通过 Intranet 上的 Web 应用程序更改其帐户密码 起初 一切似乎都进展顺利 在开发过程中 我们的测试帐户的密码可以毫无问题地更改 然而 当我们让系统上线时 我们开始遇到问题 以下是症状 起初 一切都
  • SQL服务器触发器

    我有一个这样的表结构 create table status master Name varchar 40 status varchar 10 如果状态列值更新值 我需要为状态列创建触发器 如果失败 则触发器调用一个插入命令 例如 inse
  • 如何在空间和频率域中的每个尺度和方向创建 64 个 Gabor 特征

    通常 Gabor 滤波器 顾名思义 用于过滤图像并提取与过滤方向相同的所有内容 在这个问题中 您可以看到比此中编写的代码更有效的代码Link 假设 4 个方向上有 16 个尺度的滤波器 因此我们得到 64 个 gabor 滤波器 scale
  • 何时使用 FormGroup 与 FormArray?

    表格组 A 表格组将每个子 FormControl 的值聚合为一个 对象 以每个控件名称作为键 const form new FormGroup first new FormControl Nancy Validators minLengt
  • python 守护进程中的子进程终止

    我在 python 中有damon 它运行外部程序 subprocess call java jar start jar 当我杀死守护进程时 子进程 java 仍在运行 我怎样才能让子进程也被杀死 Use subprocess Popen
  • 使用 Rspec 测试 rake 任务不接受参数

    根据我的说法 我正在尝试为我的 rake 任务之一编写 Rspec 测试斯蒂芬 哈格曼的这篇文章 lib tasks retry rake namespace retry do task message message id gt envi
  • 寻找最小全语法窗口的有效算法?

    A 全语法窗口是包含所有 26 个字母表的较大文本片段的子字符串 引用维基百科的一个例子 给出以下文本 我唱了 还以为自己唱得很好 但他只是用一种非常好奇的表情抬头看着我的脸 然后说 你唱歌多久了 小姐 文本中最小的全语法窗口是这个字符串
  • 错误:此模板尝试加载组件程序集“Microsoft.VisualStudio.SmartDevice”

    我安装了 Visual studio 2015 并尝试为 Windows Phone 8 1 创建测试应用程序 当我创建一个新项目时 我收到以下消息 关于如何解决这个问题有什么建议吗 这是解决方案 打开 Visual Studio 并转到T
  • 使用反射添加EventHandler

    我有这段代码不起作用 public CartaoCidadao InitializeComponent object o WebDAV Classes SCWatcher LoadAssembly MethodInfo method thi
  • SonarQube -integrationTest.exec -sonar Runner (Gradle) 或“sonar-runner”命令 - 显示 0.0% 覆盖率

    运行基于 Gradle 的构建和集成测试后 我在 build jacoco 文件夹中成功生成了 Jacoco 的 2 个 exec 文件 梯度命令 gradle clean 构建集成测试 完成后 它会在 build jacoco 文件夹下生
  • SelectMany 创建大量 SQL select 语句,而不是带有 join 的 SQL select 语句

    我正在写一个查询SelectMany并检查它在 LINQPad 中生成的 SQL 查询非常简单 假设我有 3 个实体 Customer Order OrderItem OrderItem保存有关订购什么产品以及订购数量的信息 我想得到全部O
  • 为什么“memset(arr, -1, sizeof(arr)/sizeof(int))”不能将整数数组清除为-1?

    是不是不能使用memset在整数数组上 我尝试了以下方法memset调用并没有得到正确的整数值int array int arr 5 memset arr 1 sizeof arr sizeof int 我得到的值是 arr 0 1 arr
  • 如何检查服务是否正在运行[重复]

    这个问题在这里已经有答案了 我想显示服务状态 如果它正在运行或停止 我正在使用下面的代码 但它在开始服务之前显示 已停止 当服务启动时 它显示 正在运行 当它再次停止时 它仅显示 正在运行 我在设置共享首选项状态时犯了任何错误吗 在主要活动
  • 从 pandas.DataFrame 中选择复杂的标准

    例如我有简单的 DF import pandas as pd from random import randint df pd DataFrame A randint 1 9 for x in range 10 B randint 1 9
  • PHP getopt 操作

    这个问题是关于 php 中的 getopt 函数 我需要将两个参数传递给 php 脚本 例如 php script php f filename t filetype 现在 根据文件类型 可以是 u c 或 s 我需要执行正确的操作 我正在
  • 使用 python 从重定向的 stdin 读取文件

    我正在尝试读取通过命令行重定向到标准输入的文本文件的内容 并在接收者必须将其组装回原始形式时通过互联网发送它 例如 python test py lt file txt 我尝试读取该文件并使用以下代码将其组装回来 灵感来自link for
  • 从服务器端强制刷新客户端页面[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 如何从服务器端刷新当前客户端视图页面 例如 如果我想强制刷新所有客户端现在正在查看的页面
  • 如何在卸载时自动从主屏幕删除应用程序快捷方式?

    我正在开发一个应用程序 该应用程序应在安装后将其快捷方式添加到主屏幕 并在卸载应用程序后将其删除 该应用程序将预安装在最终用户设备上 但仍然应该有卸载选项 这个任务看起来很简单 但实施起来却遇到了很多麻烦 我做了什么 使用添加快捷方式到主屏
  • 在整个范围内均匀生成随机数

    我需要在指定的间隔 max min 内生成随机数 此外 随机数应该均匀分布在区间内 而不是位于特定点 目前我生成为 for int i 0 i lt 6 i DWORD random rand max min 1 min 根据我的测试 随机