C/C++隨機數(shù)生成的五種方法
更新時間:2025年03月17日 11:21:59 作者:極客代碼
C++作為一種古老的編程語言,其隨機數(shù)生成的方法已經(jīng)經(jīng)歷了多次的變革,早期的C++版本使用的是rand()函數(shù)和RAND_MAX常量,這種方法雖然簡單,但并不總是提供高質(zhì)量的隨機數(shù),本文給大家介紹了C/C++隨機數(shù)生成的五種方法,需要的朋友可以參考下
C/C++ 隨機數(shù)生成方法
1. 使用 rand() 和 srand()
- 庫:
<stdlib.h>或<cstdlib> - 特點: 偽隨機數(shù)生成器,簡單易用。
- 示例:
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 初始化隨機數(shù)生成器
int random_number = rand() % 100; // 生成 0 到 99 之間的隨機數(shù)
printf("Random number: %d\n", random_number);
return 0;
}2. 使用 <random> 庫
- 庫:
<random> - 特點: 提供了多種隨機數(shù)生成器和分布。
- 示例:
#include <random>
#include <iostream>
int main() {
std::random_device rd; // 真隨機數(shù)生成器
std::mt19937 gen(rd()); // Mersenne Twister 引擎
std::uniform_int_distribution<> dis(0, 99); // 生成 0 到 99 之間的整數(shù)
int random_number = dis(gen);
std::cout << "Random number: " << random_number << std::endl;
return 0;
}3. 使用 /dev/random 和 /dev/urandom
- 庫: 不需要特殊庫,直接通過文件操作讀取。
- 特點: 提供真隨機數(shù)。
- 示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file = fopen("/dev/urandom", "rb");
unsigned char random_byte;
if (fread(&random_byte, 1, 1, file) != 1) {
perror("fread");
exit(EXIT_FAILURE);
}
fclose(file);
int random_number = random_byte % 100;
printf("Random number: %d\n", random_number);
return 0;
}4. 使用硬件隨機數(shù)生成指令
- 庫:
<x86intrin.h> - 特點: 提供硬件級別的真隨機數(shù)。
- 示例:
#include <x86intrin.h>
#include <stdio.h>
int main() {
unsigned int random_number;
_rdrand32_step(&random_number); // 可能需要多次嘗試才能成功
printf("Random number: %u\n", random_number % 100);
return 0;
}5. 使用 OpenSSL 庫
- 庫:
<openssl/rand.h> - 特點: 提供高質(zhì)量隨機數(shù),適用于加密。
- 示例:
#include <openssl/rand.h>
#include <stdio.h>
int main() {
unsigned char random_bytes[4]; // 生成 4 字節(jié)隨機數(shù)
if (!RAND_bytes(random_bytes, sizeof(random_bytes))) {
printf("RAND_bytes failed\n");
return 1;
}
unsigned int random_number = *(unsigned int *)random_bytes;
printf("Random number: %u\n", random_number % 100);
return 0;
}選擇合適的隨機數(shù)生成方法
- 偽隨機數(shù)生成器 (
rand(),<random>): 適用于對隨機性要求不高的場合,如游戲開發(fā)中的簡單隨機事件。 - 真隨機數(shù)生成器 (
/dev/urandom, OpenSSL, 硬件隨機數(shù)生成器): 適用于安全性要求高的場合,如密碼學(xué)應(yīng)用、加密密鑰生成。
注意事項
- 使用
/dev/random時要注意,如果系統(tǒng)熵池中的熵不夠,讀取/dev/random可能會阻塞,直到有足夠的熵產(chǎn)生。 - 對于安全性敏感的應(yīng)用,應(yīng)避免使用
rand()和srand(),因為它們生成的是偽隨機數(shù),不適合用于加密。 - 在選擇隨機數(shù)生成器時,要考慮到性能和安全性之間的平衡。
這些方法覆蓋了從簡單的偽隨機數(shù)到高質(zhì)量的真隨機數(shù)生成的不同場景。
到此這篇關(guān)于C/C++隨機數(shù)生成的五種方法的文章就介紹到這了,更多相關(guān)C/C++隨機數(shù)生成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語言?數(shù)據(jù)存儲與原碼?反碼?補碼詳細解析
不知道你是否和我一樣好奇,學(xué)習(xí)編程語言的同時想,各個數(shù)據(jù)類型是怎樣在我們的內(nèi)存中儲存的呢,如果你仔細深入了解的話,你會了解其中的樂趣,了解科學(xué)家們的偉大,了解c語言2022-02-02
解決vscode下調(diào)試c/c++程序一閃而過的問題(Windows)
這篇文章主要介紹了解決vscode下調(diào)試c/c++程序一閃而過(Windows),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
C++ xxx_cast實現(xiàn)轉(zhuǎn)換代碼實例解析
這篇文章主要介紹了C++xxx_cast轉(zhuǎn)換代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊列的實現(xiàn)過程
這篇文章主要介紹了C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊列的實現(xiàn)過程,了解內(nèi)部原理是為了幫助我們做擴展,同時也是驗證了一個人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的,跟隨下文來具體了解吧2023-02-02
基于QT和百度云api實現(xiàn)批量獲取PDF局部文字內(nèi)容
這篇文章將為大家介紹如何使用 QT 構(gòu)建圖形用戶界面,結(jié)合百度云 OCR API 實現(xiàn)批量獲取 PDF 局部文字內(nèi)容并對文件進行改名的功能,需要的可以參考下2025-03-03

