c/c++生成随机数

C

相关函数

void srand(unsigned)

函数设置随机数生成器的种子 参数传入time(NULL)时间种子

rand()

rand()函数的返回值范围为0到RAND_MAX之间的一个整数,其中RAND_MAX是stdlib.h中定义的一个宏,其值是2147483647(即2的31次方减1)

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

int main() {
    // 设置随机数生成器种子
    srand(time(NULL));
    
    // 生成 10 个随机整数
    for (int i = 0; i < 10; i++) {
        int r = rand();
        //范围0-9
        int x = rand() % 10double d = (double) rand() / RAND_MAX * (max - min) + min;
        printf("%d ", r);
    }
    
    return 0;
}

C++

random

c++ 标准库提供生成随机数库random

random中有两个类:随机数引擎类(random-number engines)、随机数分布类(random-number distribution)

随机数引擎

随机数引擎是函数对象类,他们定义了一个运用运算符,该运算符不接受参数,并返回一个随机的unsigned整数。可以通过调用一个随机数引擎对象来生成原始随机数

#include <iostream>
#include <random>

int main(){
    //定义一个名为e的default_random_engine的对象。然后调用对象e获得10个随机数(伪随机数)
    default_random_engine e;
    //加入时间种子
    default_random_engine e(time(NULL);
        for(int i=0;i<10;i++){
            std::cout<<e()<<std::endl;
        }
    return 0;
}

分布类型和引擎

用分布类型的对象可以得到在指定范围内的数
uniform_int_distribution 产生在一个范围上均匀分布的整数值
uniform_real_distribution 产生在一个范围上均匀分布的实数值

#include <iostream>
#include <random>

    
int main(){
   //生成无符号随机整数
   std::default_random_engine e;
   //生成0到9之间(包括9)均匀分布的随机整数
   std::uniform_int_distribution<unsigned int>u(0,9);
   for(int i=0;i<10;i++){
      std::cout<<std::udistribution(e)<<std::endl;
      std::cout<<u(e)<<std::endl;
   }
	//生成-9到9之间(包括9)均匀分布的随机整数
   uniform_int_distribution<int>u1(-9, 9);
   for(int i=0;i<10;i++){
      std::cout<<u1(e)<<std::endl;
   }


    //定义浮点型随机数的取值范围
    std::default_random_engine real_engine; //定义随机数引擎
    std::uniform_real_distribution<double> doubleDistribution(10000.1, 99999.9);
    std::cout << doubleDistribution(real_engine) << std::endl;
    return 0;
}

另一种方式

mt19937是C++11标准库中的随机数生成器。它是基于Mersenne Twister算法实现的。Mersenne Twister是一种伪随机数生成器,能够产生高质量、高精度的随机数序列。
mt19937使用32位整数来存储随机数,并采用了twisted general feedback shift register的结构来生成随机数序列。该算法在生成随机数时具有高度的周期性和均匀性,因此在实际应用中得到了广泛的应用。
mt19937提供了一系列方法来生成不同类型的随机数,如生成整数、实数、布尔值等。使用mt19937生成随机数的过程中,需要指定随机数的生成范围,并且需要提供一个seed值作为随机数生成器的种子,以保证每次生成的随机数序列是不同的。

std::random_device rd;  // 将用于获得随机数引擎的种子
std::mt19937 gen(rd()); // 以 rd() 播种的标准 mersenne_twister_engine
uniform_real_distribution<> dis(10000, 99999);
for (int n = 0; n < 10; ++n) {
  // 用 dis 变换 gen 生成的随机 unsigned int 为 [1, 2) 中的 double
  std::cout << dis(gen) << std::endl; // 每次调用 dis(gen) 都生成新的随机 double
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值