c语言生成10000个随机数

99ANYc3cd6
预计阅读时长 19 分钟
位置: 首页 C语言 正文

核心概念

在C语言中,随机数的生成主要依赖于两个函数:

  1. srand(unsigned int seed): 设置随机数生成器的种子
    • 如果不设置种子,rand() 每次运行程序时都会产生相同的“伪随机数”序列。
    • 为了让每次运行的结果都不同,我们需要一个“变化”的种子,最常用的方法是使用当前时间,通过 time(0) 获取。
  2. int rand(): 生成一个随机整数
    • 这个函数会返回一个范围在 0RAND_MAX 之间的整数。RAND_MAX 是一个在 stdlib.h 中定义的宏,通常是 327672147483647

最基础的控制台输出

这是最直接的方法,在屏幕上打印出10000个随机数。

代码

#include <stdio.h>
#include <stdlib.h> // 包含 rand() 和 srand() 的头文件
#include <time.h>   // 包含 time() 的头文件
#define COUNT 10000 // 定义要生成的随机数数量
int main() {
    // 1. 设置随机数种子
    // 使用当前时间作为种子,这样每次运行程序时,种子都不同,生成的随机数序列也不同。
    // time(0) 返回一个时间戳,类型是 time_t,需要强制转换为 unsigned int 传给 srand。
    srand((unsigned int)time(0));
    printf("开始生成 %d 个随机数...\n", COUNT);
    // 2. 循环生成并打印随机数
    for (int i = 0; i < COUNT; i++) {
        // rand() 生成一个 0 到 RAND_MAX 之间的随机整数
        int random_number = rand();
        printf("%d\n", random_number);
    }
    printf("生成完毕,\n");
    return 0;
}

如何编译和运行

  1. 将代码保存为 generate_random.c
  2. 打开终端或命令提示符,使用GCC进行编译:
    gcc generate_random.c -o generate_random
  3. 运行生成的可执行文件:
    ./generate_random

优点

  • 简单直观,易于理解。

缺点

  • 性能问题:向控制台打印10000行数据非常慢,且会瞬间刷屏,无法查看。
  • 数据无法保存:数据只在程序运行时存在于屏幕上,程序结束后就消失了,无法用于后续分析。

生成指定范围内的随机数并保存到文件

在实际应用中,我们通常需要:

  1. 生成特定范围内的随机数(1 到 100)。
  2. 将结果保存到文件中,以便后续处理。

代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define COUNT 10000
#define MIN_VALUE 1
#define MAX_VALUE 100
int main() {
    // 1. 设置随机数种子
    srand((unsigned int)time(0));
    // 2. 以写入模式打开文件 "random_numbers.txt"
    // "w" 表示如果文件不存在则创建,如果存在则覆盖
    FILE *file = fopen("random_numbers.txt", "w");
    if (file == NULL) {
        printf("无法创建文件!\n");
        return 1; // 返回非零值表示程序出错
    }
    printf("正在生成 %d 个在 %d 到 %d 范围内的随机数,并保存到 random_numbers.txt...\n", COUNT, MIN_VALUE, MAX_VALUE);
    // 3. 循环生成随机数并写入文件
    for (int i = 0; i < COUNT; i++) {
        // 生成 MIN_VALUE 到 MAX_VALUE 之间的随机数
        // 公式: rand() % (MAX_VALUE - MIN_VALUE + 1) + MIN_VALUE
        int random_number = rand() % (MAX_VALUE - MIN_VALUE + 1) + MIN_VALUE;
        // 将随机数写入文件,后面跟一个换行符,方便后续逐行读取
        fprintf(file, "%d\n", random_number);
    }
    // 4. 关闭文件
    fclose(file);
    printf("生成完毕,数据已保存到 random_numbers.txt,\n");
    return 0;
}

代码解释

  1. #define MIN_VALUE 1#define MAX_VALUE 100:定义了随机数的范围,方便修改。
  2. *`FILE file = fopen("random_numbers.txt", "w");`**:这是C语言中标准文件操作。
    • fopen 用于打开文件,返回一个指向 FILE 结构体的指针。
    • "random_numbers.txt" 是文件名。
    • "w" 是模式,表示“写入”(Write),如果文件已存在,其内容将被清空。
  3. if (file == NULL):这是一个非常重要的错误检查,如果由于某些原因(如磁盘已满、没有写入权限)文件无法创建,fopen 会返回 NULL,此时程序应该报错并退出,而不是继续执行。
  4. rand() % (MAX_VALUE - MIN_VALUE + 1) + MIN_VALUE:这是生成指定范围随机数的核心公式。
    • rand() % N 会生成一个 0N-1 之间的数。
    • 我们希望的范围大小是 MAX_VALUE - MIN_VALUE + 1
    • rand() % (MAX_VALUE - MIN_VALUE + 1) 生成 0(MAX_VALUE - MIN_VALUE) 的数。
    • + MIN_VALUE 将整个范围向上平移,最终得到 MIN_VALUEMAX_VALUE 的数。
  5. fprintf(file, "%d\n", random_number);fprintf 函数和 printf 类似,但它不是打印到屏幕(标准输出),而是打印到指定的文件流中。
  6. fclose(file);:关闭文件,这是一个好习惯,可以释放系统资源,确保所有数据都被正确写入磁盘。

如何编译和运行

编译和运行命令与方法一相同,运行后,你会在同一目录下找到一个名为 random_numbers.txt 的文件,里面包含了10000行1到100之间的随机数。


更高质量的随机数(C++11 风格,C11标准)

如果你追求更高质量的、统计学上更“随机”的随机数(例如用于模拟、加密等),可以使用 C11 标准引入的 <stdatomic.h> 和更现代的算法,对于大多数普通应用,rand() 已经足够。

这里展示一个使用 C++ <random> 库的例子,因为它在C++中是标准且非常强大的,理解其思想对C11也有帮助。

// 这是一个 C++ 示例,展示了现代C++的随机数生成方法
#include <iostream>
#include <vector>
#include <random>
#include <fstream>
#include <chrono>
int main() {
    const int COUNT = 10000;
    const int MIN_VALUE = 1;
    const int MAX_VALUE = 100;
    // 1. 使用更高质量的随机数引擎
    // std::mt19937 是一个 Mersenne Twister 引擎,性能和随机性都很好
    // 使用高精度时钟作为种子
    std::random_device rd;  // 获取一个真正的随机数种子(如果硬件支持)
    std::mt19937 gen(rd()); // 使用 rd() 作为引擎的种子
    // 2. 定义一个分布,将引擎的输出映射到我们想要的范围内
    std::uniform_int_distribution<> distrib(MIN_VALUE, MAX_VALUE);
    // 3. 打开文件
    std::ofstream file("cpp_random_numbers.txt");
    if (!file.is_open()) {
        std::cerr << "无法创建文件!" << std::endl;
        return 1;
    }
    std::cout << "正在使用 C++ 方法生成 " << COUNT << " 个随机数..." << std::endl;
    // 4. 生成并写入
    for (int i = 0; i < COUNT; ++i) {
        int random_number = distrib(gen); // 从分布中获取一个随机数
        file << random_number << "\n";
    }
    file.close();
    std::cout << "生成完毕,数据已保存到 cpp_random_numbers.txt。" << std::endl;
    return 0;
}

这个C++例子展示了分离“随机数引擎”(负责生成随机比特流)和“概率分布”(负责将这些比特流映射到特定范围)的思想,这是现代随机数生成的最佳实践,C11标准也引入了类似的机制,但语法上不如C++方便。

总结与建议

特性 方法一 (基础控制台) 方法二 (文件保存) 方法三 (高质量)
适用场景 学习、快速测试 绝大多数实际应用 科学计算、模拟、加密
优点 简单、无需文件操作 数据可保存、可控范围 随机质量高、可定制分布
缺点 无法查看数据、性能差 需要文件I/O知识 语法复杂(尤其C11)

对于您的需求“生成10000个随机数”,强烈推荐使用方法二,它解决了性能和数据持久化的问题,是C语言处理此类任务的经典和标准做法。

-- 展开阅读全文 --
头像
C语言数组常见操作有哪些关键点?
« 上一篇 02-04
dede登陆成功进不了后台
下一篇 » 02-04

相关文章

取消
微信二维码
支付宝二维码

目录[+]