21xrx.com
2024-12-22 22:22:53 Sunday
登录
文章检索 我的文章 写文章
如何在C++中生成随机数函数?
2023-07-08 13:59:48 深夜i     --     --
C++ 随机数 函数 生成 方法

在编写C++代码的过程中,经常需要使用随机数函数来生成随机数。随机数是指数字或数值的序列,这些数字出现的顺序和大小是不可预测的。在本文中,我们将介绍如何在C++中生成随机数函数。

C++标准库提供了两种生成随机数的方式:C语言的rand()函数和C++11引入的random库。

1. rand()函数

rand()函数是C语言中生成随机数的函数,也被C++所继承。该函数用当前时间作为随机数发生器的种子,返回0到RAND_MAX之间的一个随机整数。

如下是使用rand()函数生成随机数的基本语法:


#include <cstdlib>

#include <ctime>

#include <iostream>

// 生成布尔随机数

bool getRandomBool() {

  return (rand() % 2) == 1;

}

// 生成1到maxValue之间整数的随机数

int getRandomInt(int maxValue) {

  return rand() % maxValue + 1;

}

// 生成指定范围内的随机数

int getRandomInScope(int from, int to) {

  return rand() % (to - from + 1) + from;

}

int main() {

  srand((unsigned) time(0));

  std::cout << "bool : " << getRandomBool() << std::endl;

  std::cout << "int : " << getRandomInt(100) << std::endl;

  std::cout << "int : " << getRandomInScope(10, 30) << std::endl;

  return 0;

}

需要注意的是,rand()函数在多次调用时,生成的序列是重复的。如果需要生成不同的随机数序列,则需要在每次程序运行时都设置种子,以随机生成不同的序列。以上代码中的`srand((unsigned) time(0))`就是用当前时间作为种子,实现随机生成不同的序列。

2. random库

C++11引入了random库,该库提供了更加丰富的随机数生成器,可以生成不同类型的随机数(如整数、浮点数、布尔值等)。

使用random库可以分为三个步骤:

步骤1:创建随机数生成器。随机数生成器是一个随机数引擎,我们可以创建不同类型的引擎。常见的引擎有minstd_rand、mt19937、ranlux24和default_random_engine等。

步骤2:定义随机数分布。题目所需要的随机数通常具有一定的规律,如可以控制随机数的上下界等。因此,我们需要根据需要定义不同的随机数分布。常见的分布有uniform_int_distribution、uniform_real_distribution和bernoulli_distribution等。

步骤3:生成随机数。根据前两个步骤的定义,最后就可以生成需要的随机数了。

下面是一个生成整数随机数的例子:


#include <iostream>

#include <random>

int main()

{

  // 创建引擎

  std::random_device rd;

  std::mt19937 eng(rd());

  // 定义分布

  std::uniform_int_distribution<> distr(1,6);

  // 生成随机数

  for (int i = 0; i < 10; ++i) {

    std::cout << distr(eng) << std::endl;

  }

  return 0;

}

以上代码中的`std::mt19937`是引擎类型中的一种,`std::uniform_int_distribution<> distr(1,6)`是随机数分布类型中的一种。`distr(eng)`就是用引擎生成一个随机数。

总结:

本文介绍了两种在C++中生成随机数的方法,一种是使用原始的rand()函数,另一种是使用C++11引入的random库。两种方法都可以生成需要的随机数,不同之处在于random库提供了更加丰富的随机数生成器和分布类型,可以更好地满足题目要求。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复