随机数Random的两种写法

Math.random:   这是一个默认方法,不接受任何参数

随机范围: 0<Math.random ( ) < 1.0

double r = Math.random ( ) ;        //默认是double类型,转别的类型需要强转


int a = (int) (Math.random( )*100);    //从0到100之间 不包含100
//Math.random后面的括号里面不能写东西


double x = Math.random ( )+15;    // [ 15,15+1)

double y = Math.random ( )*15;    //  [ 0,15)

double o = Math.random ( ) *15 +10; 

double p = (Math.random ( )*15) +10;

o和p的写法虽不同 但是 范围是一样的 都是 [ 10,25) 

 左包含 右不包含



Random方法
使用这个方法需要先new 一个Random类型的对象

Random r = new Random();        //用Random方法需要新建一个对象

int a = r.nextInt ( 100 ) ;         //  [ 0,100 ) ; 

int b = r.nextInt(180)+121;    // (0到180)+121  范围是121到301  不包含301的整数

double c = (r.nextDouble ( )*121)+15;    //15到135的小数


double d = (r.nextDouble ( )+121)+15;    //136到136+1的小数





<think>好的,用户想了解C++中生成随机数的方法,并需要示例代码。我需要结合之前的引用资料和用户的历史问题来回答。用户之前问过vector的声明,现在转向随机数生成,可能需要基础到高级的方法。 首先,用户提供的引用资料里有五种方法,包括传统的rand/srand,<random>库中的方法,以及不同的引擎和分布。我需要整理这些信息,分点说明,确保涵盖不同方法的优缺点。 用户可能对C++11的新特性更感兴趣,因为<random>库更推荐使用。但也不能忽略旧方法,因为有些遗留代码可能还在用rand。需要指出每种方法的适用场景,比如简单需求vs高质量随机数需求。 要注意代码示例的正确性,比如使用std::random_device作为种子,Mersenne Twister引擎,以及不同的分布类型。还要提到编译器需要支持C++11,可能用户需要这方面的提示。 另外,引用资料中提到srand(time(nullptr))的方式,但这种方法可能存在缺陷,比如时间种子如果重复,随机数序列也会重复。而<random>库更安全,分布更均匀。需要对比说明,帮助用户理解为什么推荐新方法。 用户可能需要实际示例,所以每个方法都要有代码片段,并解释关键部分。例如,在C++11方法中,如何组合引擎和分布,如何生成不同范围的数。 还要注意潜在问题,比如多次调用randomValue函数时可能的重用引擎问题,需要提醒用户将引擎和分布定义为静态或全局,或者传递它们。 最后,总结不同方法的优缺点,帮助用户根据需求选择。确保回答结构清晰,分点明确,代码格式正确,符合之前设定的系统指令,比如使用$$...$$格式的独立公式,但这里可能更多是代码块,所以要注意使用正确的代码标记。</think>### C++ 随机数生成方法详解(含示例代码) 在C++中生成随机数主要有两种方式:传统C风格方法(`rand()`)和现代C++11方法(`<random>`库)。以下是5种常用方法及其具体实现: --- #### 一、传统C风格方法(C++11前) ##### 1. 基本`rand()`函数 ```cpp #include <cstdlib> #include <ctime> int main() { srand(time(nullptr)); // 设置时间种子 int num = rand() % 100; // 生成0-99的随机数 return 0; } ``` - **特点**:简单但随机性质量较低 - **缺陷**: - 周期性重复问题(周期为$2^{32}$) - 模运算导致分布不均匀[^3] ##### 2. 生成浮点随机数 ```cpp float rand_float() { return static_cast<float>(rand()) / RAND_MAX; // [0.0, 1.0] } ``` --- #### 二、现代C++11方法(推荐) ##### 3.随机数生成器(硬件熵源) ```cpp #include <random> int main() { std::random_device rd; // 使用硬件熵源 int true_random = rd() % 100; // 直接生成随机数 return 0; } ``` - **特点**:完全不可预测,但生成速度慢 - **适用场景**:加密、安全相关场景[^4] ##### 4. Mersenne Twister引擎(常用伪随机) ```cpp std::mt19937 gen(std::random_device{}()); // 初始化引擎 std::uniform_int_distribution<int> dis(1, 6); // 定义分布范围 int dice_roll = dis(gen); // 生成1-6的整数 ``` - **优势**: - 周期长达$2^{19937}-1$[^2] - 支持多种分布类型 ##### 5. 自定义分布示例 ```cpp // 生成正态分布随机数 std::normal_distribution<double> normal_dist(50.0, 10.0); double height = normal_dist(gen); // 均值50,标准差10 // 生成布尔值 std::bernoulli_distribution bool_dist(0.3); // 30%概率为true bool result = bool_dist(gen); ``` --- #### 三、完整示例代码(C++11推荐写法) ```cpp #include <iostream> #include <random> #include <vector> // 生成指定范围的随机整数 int random_int(int min, int max) { static std::mt19937 gen(std::random_device{}()); std::uniform_int_distribution<int> dis(min, max); return dis(gen); } // 生成指定范围的随机浮点数 double random_double(double min, double max) { static std::mt19937 gen(std::random_device{}()); std::uniform_real_distribution<double> dis(min, max); return dis(gen); } int main() { // 生成10个[1,100]随机整数 std::vector<int> numbers; for(int i=0; i<10; ++i) { numbers.push_back(random_int(1, 100)); } // 生成概率分布随机数 std::normal_distribution<double> exam_scores(75.0, 8.0); std::cout << "模拟考试成绩: " << exam_scores(gen) << std::endl; return 0; } ``` --- #### 四、方法对比与选择建议 | 方法 | 优点 | 缺点 | 适用场景 | |---------------------|--------------------------|--------------------------|----------------------| | `rand()` | 简单易用 | 随机性差,分布不均匀 | 快速原型开发 | | `random_device` | 真随机 | 速度慢,可能耗尽力源 | 加密/安全需求 | | `mt19937` | 高质量伪随机,周期长 | 需要初始化种子 | 通用随机需求 | | 概率分布类 | 支持复杂分布 | 需要学习分布类型 | 统计模拟/机器学习 | --- #### 五、注意事项 1. **种子管理**: ```cpp // 错误写法:在循环内重复创建引擎 for(int i=0; i<10; i++) { std::mt19937 gen(rd()); // 每次创建新引擎会降低随机性 } // 正确写法:保持引擎的持久性 static std::mt19937 gen(rd()); // 使用static或全局变量 ``` 2. **跨平台一致性**: - `std::random_device`在部分平台可能退化为伪随机 - 可用`std::seed_seq`增强种子质量: ```cpp std::seed_seq seq{1,2,3,4,5}; std::mt19937 gen(seq); ``` 3. **性能优化**: ```cpp // 重用分布对象(避免重复构造) static std::uniform_int_distribution<int> dis(0, 100); ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值