C++生成随机浮点数的示例代码

目录
  • 前言
  • rand生成随机数
    • 问题出现
    • 初步解决
    • 最终方法
  • 生成等概率随机数
    • 生成随机整数
    • 生成随机浮点数
  • 生成非均匀分布随机数
    • 正态分布随机数
    • 二项分布的布尔值

前言

在C++11之前,我们通常采用rand函数来生成随机数。

但rand函数对一些情况显得难以处理:

  • 不同范围的随机数
  • 需要随机浮点数
  • 需要非均匀分布的随机数

rand生成随机数

问题出现

场景描述:

想生成一组整形随机数,放入数组中,用来测试自己的排序是否正确。

于是我写出了下方代码,生成随机数。

先简单了解下用到的函数:

//返回time_t类型的 当前时间的时间戳
time_t time (time_t* timer);

//传入一个种子,为伪随机数生成器初始化
void srand (unsigned int seed);

//得到一个整形伪随机数
int rand (void);
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
    int arr[10] = { 0 };

    for (int i = 0; i < 10; ++i)
    {
        srand((unsigned int)time(NULL));
        //两个相减是为了出现负的随机数,使测试范围更广
        arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1);

        printf("%d ", arr[i]);
    }

    return 0;
}

我发现尽管我调用了srand函数,可生成的数组值还是同一个。

我思考后想到,因为for循环执行速度太快,整个程序都是在一秒内完成的。

所以出现了都是同一个值的情况。

初步解决

于是我想出了下面的解决方法:

我可以在for循环内调用Sleep函数,让我的电脑休眠一下,这样就不会出现上述情况了。

于是我写出了下方的代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
    int arr[10] = { 0 };

    for (int i = 0; i < 10; ++i)
    {
        Sleep(1000);
        srand((unsigned int)time(NULL));
        arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1);

        printf("%d ", arr[i]);
    }

    return 0;
}

通过休眠后,就成功解决问题了。

可是,

如果睡眠时间太短,那么还是会出现重复的现象;

如果睡眠时间太长,程序运行速度就太慢。

最终方法

因为上述的原因,我继续查询资料,了解了rand和srand的基本原理,最终成功解决了该问题。

给srand函数传入一个数值后,srand会根据这个生成一个随机序列表(通常有4,294,967,296个数),传入相同的数生成的序列表是相同的。然后rand从序列的头部取出一个数返回,然后将这个数放在随机序列表尾部,因此如果你要取的数据量非常大,是会出现与之前取出的数重复的情况。

此时,上面出现的问题也很好解决了。因为计算机运行速度很快,所以我们每次进入循环都会生成一个相同的随机序列表,rand函数只会取出其第一个数。

要解决这个问题,我们只需要在循环前调用一次srand函数就好了,这样就不会重复生成序列表了。

下方是最终形式的代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
    int arr[10] = { 0 };

    srand((unsigned int)time(NULL));
    for (int i = 0; i < 10; ++i)
    {
        arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1);

        printf("%d ", arr[i]);
    }

    return 0;
}

下文将使用C++11定义在头文件random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类随机数分布类

  • 一个引擎类可以生成unsigned随机数序列
  • 一个分布类使用一个引擎类生成指定类型的、在给定范围内的、服从特定概率分布的随机数

生成等概率随机数

生成随机整数

uniform_int_distribution:产生均匀分布的整数

template <class IntType = int>
class uniform_int_distribution;

// IntType
// An integer type. Aliased as member type result_type.
// By default, this is int.
#include <iostream>
#include <random>
#include <ctime>
using namespace std;

int main()
{
    //产生[1, 100]左闭右闭区间的随机整数
	uniform_int_distribution<int> u(1, 100);
	default_random_engine e;
    //为随机数引擎设置随机种子,若不设置每次生成的随机数相同(可以创建时设置)
    //类似srand的用法,相同的种子生成的随机数相同
    //default_random_engine e(time(NULL));
    e.seed(time(NULL));

	for (size_t i = 0; i < 10; ++i)
	{
		cout << u(e) << " ";
	}
	cout << endl;

	return 0;
}

生成随机浮点数

uniform_real_distribution:产生均匀分布的实数

template <class RealType = double>
class uniform_real_distribution;

// RealType
// A floating-point type. Aliased as member type result_type.
// By default, this is double.
#include <iostream>
#include <random>
#include <ctime>
using namespace std;

int main()
{
    //生成[-1, 1]范围随机浮点数
    //模板参数只能是浮点类型(float,double, long double)
	uniform_real_distribution<double> u(-1, 1);
    default_random_engine e(time(NULL));

	for (size_t i = 0; i < 10; ++i)
	{
		cout << u(e) << " ";
	}
	cout << endl;

	return 0;
}

生成非均匀分布随机数

正态分布随机数

template <class RealType = double>
class normal_distribution;
#include <iostream>
#include <random>
#include <ctime>
using namespace std;

int main()
{
    //生成符合均值为10,标准差为2的随机数
	normal_distribution<double> u(10, 2);
    default_random_engine e(time(NULL));

	for (size_t i = 1; i <= 100; ++i)
	{
		printf("%-9.6lf ", u(e));
		if (i % 10 == 0)
		{
			cout << endl;
		}
	}
    cout << endl;

	return 0;
}

二项分布的布尔值

class bernoulli_distribution;
#include <iostream>
#include <random>
#include <ctime>
using namespace std;

int main()
{
	// 生成1的概率为0.7
	bernoulli_distribution u(0.7);
    default_random_engine e(time(NULL));

	for (int i = 0; i < 10; i++) {
		cout << u(e) << " ";
	}
    cout << endl;

	return 0;
}

以上就是C++生成随机浮点数的示例代码的详细内容,更多关于C++随机浮点数的资料请关注我们其它相关文章!

(0)

相关推荐

  • c++ 随机数问题的相关研究

    1.问题背景 某项目中有个复杂的排序,先是各种规则依次排序,最后如果依然并列的话,那就随机位置,名次并列.测试中发现一个诡异现象,并列时随机排序但随机后2个case打印的顺序每次都一样,随机数没有起到任何作用.经过分析发现,随机数种子srand(clock()),本意是希望连续调用这个函数,给多个随机数设置种子,实际上设置的种子相同,最后产生的随机数是伪随机数.那么有没有一种随机数方法可以在较快的循环中,保证随机性呢? 原问题较复杂,给个类似的例子说明具体场景: void test_random

  • C++随机数生成实例讲解

    如果让你用C++来生成0--N-1之间的随机数,你会怎么做?你可能会说,很简单,看: srand( (unsigned)time( NULL ) ); rand() % N; 仔细想一下,这个结果是随机的吗(当然,我们不考虑rand()函数的伪随机性)? 不是的,因为rand()的上限是RAND_MAX,而一般情况下,RAND_MAX并不是N的整数倍,那么如果RAND_MAX % = r,则0--r之间的数值的概率就要大一些,而r+1--N-1之间的数值的概率就要小一些.还有,如果N > RAN

  • c++实现简单随机数的代码

    c++简单随机数 #include<iostream> #include<ctime> #include<cstdlib> using namespace std; int random(int n) { return (long long)rand()*rand%n; } int main() { srand(unsigned(time(0))); // //求负数随机数,先产生0-2n之间的随机整数,再减去n就得到了-n - n 之间的数 } 实例扩展: 随机数引擎

  • C++产生随机数的实现代码

    C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C++里没有自带的random(int number)函数. (1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX值至少为32767.例如: 复制代码 代码如下: #include<stdio.h>#include <iostream> 复制代码 代码如下: int _tmain(int argc,

  • C++常见获取随机数的方法小结

    本文实例讲述了C++常见获取随机数的方法.分享给大家供大家参考,具体如下: 方法一: 使用 rand 函数可以获取,如下. #include<iostream> #include<ctime> using namespace std; int main() { for (int i = 0; i < 10; i++) cout << rand() << endl; return 0; } 随机数大小是在0到RAND_MAX,值为2147483647,它

  • C++生成随机数的实现代码

    C风格 C为随机数提供的工具是rand.srand和RAND_MAX,定义在<stdlib.h>中. srand为rand设置种子,如果不设置,相当于调用过srand(1).rand产生伪随机数,其范围为0到RAND_MAX,RAND_MAX至少是32767,在MSVC和GCC中这个值都是32767. 伪随机数看似随机,实则是有规律可循的,对于相同的种子值,rand产生的序列完全相同,也就是说无论你给srand一个什么数字,多次运行程序的结果都将相同--除非你给srand的是不同的数字,比如时

  • C++生成随机浮点数的示例代码

    目录 前言 rand生成随机数 问题出现 初步解决 最终方法 生成等概率随机数 生成随机整数 生成随机浮点数 生成非均匀分布随机数 正态分布随机数 二项分布的布尔值 前言 在C++11之前,我们通常采用rand函数来生成随机数. 但rand函数对一些情况显得难以处理: 不同范围的随机数 需要随机浮点数 需要非均匀分布的随机数 rand生成随机数 问题出现 场景描述: 想生成一组整形随机数,放入数组中,用来测试自己的排序是否正确. 于是我写出了下方代码,生成随机数. 先简单了解下用到的函数: //

  • vue生成随机验证码的示例代码

    本文介绍了vue生成随机验证码的示例代码,分享给大家,具体如下: 样式自调,最终效果如图: 实现效果: 点击右边input框会自动切换,如果输入的值与字不同,则清空换一串随机数 HTML <input type="text" placeholder="请输入验证码" class="yanzhengma_input" @blur="checkLpicma" v-model="picLyanzhengma"

  • Java 生成随机字符的示例代码

    示例代码: import java.util.Random; import java.util.UUID; public class Dept { /** * 生成随机字符串 uuid */ public static String getUUID() { return UUID.randomUUID().toString(); } /** * 生成随机字符串 uuid 将"-"替换为"" */ public static String getUUNUM() { r

  • 详解Python中生成随机数据的示例详解

    目录 随机性有多随机 加密安全性 PRNG random 模块 数组 numpy.random 相关数据的生成 random模块与NumPy对照表 CSPRNG 尽可能随机 os.urandom() secrets 最佳保存方式 UUID 工程随机性的比较 在日常工作编程中存在着各种随机事件,同样在编程中生成随机数字的时候也是一样,随机有多随机呢?在涉及信息安全的情况下,它是最重要的问题之一.每当在 Python 中生成随机数据.字符串或数字时,最好至少大致了解这些数据是如何生成的. 用于在 P

  • java 生成文字图片的示例代码

    本文主要介绍了java 生成文字图片的示例代码,分享给大家,具体如下: import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO;

  • python实现图像随机裁剪的示例代码

    实验条件: 从1张图像随机裁剪100张图像 裁剪出图像的大小为 60 x 60 IoU 大于等于 th=0.6 的裁剪框用红色标出,其它裁剪框用蓝色标出 IoU 比对原始区域用绿框标出 实验代码: import cv2 as cv import numpy as np np.random.seed(0) # get IoU overlap ratio def iou(a, b): # get area of a area_a = (a[2] - a[0]) * (a[3] - a[1]) # g

  • 使用numpngw和matplotlib生成png动画的示例代码

    在matplotlib官网看到了第三方库numpngw的简介,利用该库作为插件可以辅助matplotlib生成png动画. numpngw概述 numpngw库可生成PNG静态图像和PNG动画. 通过write_png函数可以将 numpy保存为PNG 文件. 通过 write_apng 函数可以将数组序列保存为 PNG 动画(APNG)文件 . 通过AnimatedPNGWriter类可以将Matplotlib 保存为PNG动画文件. numpngw库的依赖包是numpy和setuptools

  • Python将QQ聊天记录生成词云的示例代码

    在这个情人节前夕,我把现任对象回收掉了,这段感情积攒了太多的失望,也给了我太多的伤害,所以我看到这个活动的第一反应是拒绝的.然而人生嘛,最重要的就是体验,沉浸在过去的回忆里没有意义,积极面对才能让自己更好地重振旗鼓. 所以,当大家都一致地在这个活动里各种秀恩爱时,我决定走一条不一样的路来为单身狗和刚分手的小伙伴们打打气:时间能改变的,是那些原本就不坚定的东西,未来的路还很长,笑一笑,一切都会过去的! 言归正传,我们要做的任务是,把 QQ 分手聊天记录导出,使用 Python 分词后做成分开的桃心

  • mongodb 数据生成Insert 语句的示例代码

    执行: db.getCollection('cap.published').find({}).forEach(function(item){     print( 'db.getCollection("cap.published").insert(' + tojson(item) + ');' ); }); 返回结果: db.getCollection("cap.published").insert({ "_id" : NumberLong(&q

  • Python生成九宫格图片的示例代码

    一.前言 大家在朋友圈应该看到过用一张图片以九宫格的方式显示,效果大致如下: 要实现上面的效果非常简单,我们只需要截取图片的九个区域即可.今天我们就要带大家使用Python来实现一下九宫格图片的生成.在开始之前,我们需要安装一下Pillow模块,语句如下: pip install pillow 下面我们先来看看一些简单的图片操作. 二.图片基本操作 今天我们会使用到三个操作,分别是读取图片.保存图片和截取图片.下面我们分别来看看. 2.1 读取图片 在Pillow中,我们最常用的就是Image子

随机推荐