c++中如何取得随机数

代码:  
  #include<time.h>  
  #include<stdlib.h>  
   
  srand((unsigned   int)time(NULL));  
  int   n   =   rand()   %   101;  
   
  解释:  
  C++/C语言里,是没有办法得到一个真正的随机数序列的。想要得到一个真正的随机数序列,必须使用特定的随机数硬件发生器。也就是说,软件是没有办法产生真正的随机数。因为软件必须按照一定的逻辑来编写。既然是按照特定的逻辑(也就是算法)来编写,那么产生的运算结果就是一定的。这一点,就是软件天生的特性。想想看,如果一个软件,同样的代码喝条件下,每次运行的结果不一样,那还有谁会用?  
   
  所以,在C++/C语言中,就有了“伪随机数”的概念。意思也就是说,通过一个特定的算法,产生一个假的随机数序列。那么,程序员又希望这个随机数序列跟接近真正的随机数序列,也就是希望每次得到的序列的不一样,所有有了一个“播种”的概念。  
  srand(   unsigned   int   seed   );  
  这个函数就是用来“播种”的。通过一个“种子”(seed),来控制随机数的序列不一样。只要种子不一样,那么通过rand()得到的随机数序列就不一样。反过来说,如果“种子”一样,那么通过srand()得到的随机数序列就是一样的。  
   
  srand(0);  
  for(   int   i   =   0;   i   <   10;   i++)  
  {  
          cout<<rand()<<'   ';  
  }  
   
  你试着将这个程序执行两次,你会发现两次的结果一样。那是因为,一旦“种子”确定了,那么这个随机数序列就确定了。软件天生的“行为可重复性”决定了这一点。  
   
  所以,一般在播种的时候,喜欢用一个随机的种子。绝大多数的情况下,会使用当前的时间。这个数字在每次程序运行的时候,都不一样。除非你手动的改系统时间。

 

time是这样声明的:
time_t time( time_t *timer );
用法是你先自己定义一个time_t变量,让后把变量的地址传给它。函数会返回自1970年1月1日0点走过的秒数,同时把这个返回值保存在你传进来的那个time_t*指向的变量里面。如果你传进来NULL的话,就不保存。

C++ 中生成随机数通常使用标准库中的随机数生成工具,这些工具定义在 `<random>` 头文件中。C++ 提供了多种生成随机数的方式,包括均匀分布的整数和浮点数,以及更复杂的分布类型。 ### 生成随机整数 使用 `std::default_random_engine` 和 `std::uniform_int_distribution` 可以生成指定范围内的随机整数。以下是一个示例,生成 1 到 100 之间的随机整数: ```cpp #include <iostream> #include <random> int main() { std::random_device rd; // 随机种子生成器 std::default_random_engine engine(rd()); std::uniform_int_distribution<int> distribution(1, 100); // 定义范围 int randomInt = distribution(engine); std::cout << "随机整数: " << randomInt << std::endl; return 0; } ``` ### 生成随机浮点数 如果需要生成 0.0 到 1.0 之间的随机浮点数,可以使用 `std::uniform_real_distribution`。以下是实现方式: ```cpp #include <iostream> #include <random> int main() { std::random_device rd; std::default_random_engine engine(rd()); std::uniform_real_distribution<float> distribution(0.0, 1.0); float randomFloat = distribution(engine); std::cout << "随机浮点数: " << randomFloat << std::endl; return 0; } ``` ### 生成服从特定分布的随机数 C++ 标准库还支持生成服从正态分布、泊松分布等的随机数。例如,使用 `std::normal_distribution` 可以生成符合标准正态分布(均值为 0,标准差为 1)的浮点数: ```cpp #include <iostream> #include <random> int main() { std::random_device rd; std::default_random_engine engine(rd()); std::normal_distribution<float> distribution(0.0, 1.0); // 均值 0,标准差 1 float normalValue = distribution(engine); std::cout << "正态分布随机数: " << normalValue << std::endl; return 0; } ``` ### 使用 `rand()` 和 `srand()` 生成随机数 传统的 C 风格方法也可以在 C++ 中使用,通过 `rand()` 和 `srand()` 函数生成随机数。虽然这种方法不如 `<random>` 库灵活和现代,但在某些遗留代码中仍然常见: ```cpp #include <iostream> #include <cstdlib> #include <ctime> int main() { std::srand(std::time(0)); // 使用当前时间作为种子 int randomInt = std::rand() % 100 + 1; // 生成 1 到 100 的随机数 std::cout << "随机整数: " << randomInt << std::endl; return 0; } ``` 需要注意的是,`rand()` 生成的随机数质量较低,不建议用于对随机性要求较高的场景[^1]。 ### 生成加密安全的随机数 对于需要高安全性的应用,如密码生成或令牌生成,应使用加密安全的伪随机数生成器(CSPRNG)。在 C++ 中,可以通过 `std::random_device` 提供的高质量随机数来实现: ```cpp #include <iostream> #include <random> int main() { std::random_device rd; // 加密安全的随机数生成器 unsigned int secureSeed = rd(); std::default_random_engine engine(secureSeed); std::uniform_int_distribution<int> distribution(1, 100); int secureRandom = distribution(engine); std::cout << "加密安全的随机整数: " << secureRandom << std::endl; return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值