Rumah > pembangunan bahagian belakang > C++ > Penjanaan nombor rawak dalam C++

Penjanaan nombor rawak dalam C++

WBOY
Lepaskan: 2023-08-22 12:10:51
asal
6205 orang telah melayarinya

Penjanaan nombor rawak dalam C++

Penjanaan nombor rawak adalah bahagian penting dalam pengaturcaraan komputer. Dalam pengaturcaraan C++, nombor rawak juga sangat biasa dan boleh digunakan untuk mensimulasikan data, menjana data ujian, pembangunan permainan, dll. Artikel ini akan memperkenalkan beberapa kaedah penjanaan nombor rawak dalam bahasa C++.

Penjanaan nombor pseudo-rawak

Algoritma penjanaan nombor pseudo-rawak ialah kaedah penjanaan nombor rawak yang digunakan dalam kebanyakan atur cara Ia bukan nombor rawak yang benar, tetapi nombor rawak pseudo yang dijana melalui algoritma matematik tertentu. Dalam C++, anda boleh menggunakan fungsi rand untuk menjana nombor pseudo-rawak. Fungsi

rand ditakrifkan dalam fail pengepala stdlib.h. Ia mengembalikan nombor rawak jenis int, antara 0 hingga RAND_MAX RAND_MAX ditakrifkan dalam fail pengepala stdlib.h, dan nilainya biasanya 32767.

Kod sampel:

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
    // 设置随机数种子
    srand(time(0));
    
    // 生成10个随机数
    for(int i = 0; i < 10; i++)
    {
        cout << rand() << endl;
    }
    
    return 0;
}
Salin selepas log masuk

Dalam kod di atas, fungsi srand digunakan untuk menetapkan benih nombor rawak, dan masa(0) boleh mendapatkan bilangan saat masa semasa, supaya keputusan menjalankan program adalah berbeza setiap kali. Kemudian gunakan gelung for untuk menjana 10 nombor rawak dan mengeluarkannya ke skrin.

Perlu diingatkan bahawa setiap kali fungsi rand dipanggil, ia akan mengembalikan nombor rawak yang unik, tetapi jika ia dipanggil beberapa kali, akan ada tahap korelasi tertentu antara nombor rawak. Oleh itu, apabila menggunakan fungsi rand untuk menghasilkan sejumlah besar nombor rawak, kaedah lain perlu digunakan untuk mengelirukan.

Penjanaan nombor rawak sebenar

Nombor rawak sebenar merujuk kepada nombor rawak yang dijana melalui fenomena fizikal Contohnya, data gelombang seismik atau ciri fotoelektrik boleh dikumpul melalui peranti perkakasan ini sangat mahal dan tidak sesuai untuk kebanyakan Untuk program, ia adalah memadai untuk menggunakan algoritma penjanaan nombor rawak.

Walau bagaimanapun, terdapat beberapa senario aplikasi yang memerlukan nombor rawak keselamatan tinggi Untuk melindungi keselamatan dan kerahsiaan data, nombor rawak benar perlu digunakan. Dalam kes ini, peranti luaran boleh digunakan untuk memberikan nombor rawak yang benar. Sebagai contoh, nombor rawak benar boleh dijana dengan membaling dadu, melambung syiling, melukis lot, dsb., tetapi kaedah ini bukan sahaja tidak cekap, tetapi juga menjana jenis nombor rawak yang terhad.

Kaedah yang lebih biasa ialah menjana nombor yang benar-benar rawak melalui peranti fizikal yang dipanggil penjana nombor rawak (RNG). Ia menjana nombor rawak dengan mengumpul proses fizikal atau prosedur matematik yang tidak dapat diramalkan, di samping menyediakan beberapa ciri keselamatan tambahan. Walau bagaimanapun, kos menggunakan penjana nombor rawak sebenar adalah jauh lebih tinggi daripada menggunakan algoritma penjanaan nombor rawak pseudo.

Penjanaan nombor rawak dalam C++ 11

C++ 11 menyediakan perpustakaan nombor rawak baharu, termasuk dua bahagian: Pertama, penjana nombor pseudo-rawak, termasuk berbilang algoritma yang boleh memenuhi keperluan pelbagai senario aplikasi dengan lebih baik, Kedua ialah penjana nombor rawak benar, yang boleh mengakses kemudahan perkakasan yang dijana khas sistem dan mengembalikan nombor rawak benar.

Pustaka penjanaan nombor rawak dalam C++ 11 termasuk:

  • minstd_rand0: Penjana Kongruen Linear
  • minstd_rand: Penjana Kongruen Linear yang Diperbaiki
  • mt19937 yang lebih baik dengan prestasi jangka panjang Mersenne T9937 dan masa yang lebih baik
  • mt19937_64: penjana Mersenne Twister 19937, mengembalikan integer 64-bit
  • ranlux24_base: penjana LUX (level, uniform, eXcellent), berjalan pantas dan berkualiti tinggi
  • ranlux48_base: LUX (level, uniform, eXcellent) penjana penjana, mengembalikan integer 48-bit, berjalan pantas dan mempunyai tinggi kualiti
  • knuth_b: penjana Knuth-B (T, P), menjana urutan rawak yang berbeza daripada standard, dengan kualiti yang lebih tinggi

Menggunakan nombor rawak dalam C++ 11 Semasa menjana perpustakaan, anda perlu memasukkan fail pengepala secara rawak, dan anda boleh menggunakan fungsi uniform_int_distribution dan uniform_real_distribution untuk mengawal julat dan jenis nombor rawak.

Kod sampel:

#include <iostream>
#include <random>

using namespace std;

int main()
{
    // 以当前时间作为种子
    default_random_engine engine(time(nullptr));
    
    // uniform_int_distribution:以等概率生成min到max范围内的整数
    uniform_int_distribution<int> distribution(0, 100);
    cout << distribution(engine) << endl;
    
    // uniform_real_distribution:以等概率生成min到max范围内的浮点数
    uniform_real_distribution<double> r_distribution(0, 100);
    cout << r_distribution(engine) << endl;

    return 0;
}
Salin selepas log masuk

Dalam kod di atas, default_random_engine digunakan untuk menjana benih nombor rawak, dan julat nombor rawak integer dan titik terapung yang dijana masing-masing dinyatakan dalam uniform_int_distribution dan uniform_real_distribution. Akhirnya, nombor rawak dijana dengan memanggil fungsi enjin.

Kesimpulan

Di atas adalah beberapa kaedah penjanaan nombor rawak biasa dalam C++ Senario aplikasi yang berbeza memerlukan kaedah penjanaan nombor rawak yang berbeza, dan anda perlu memilih kaedah yang sesuai mengikut situasi sebenar. Dalam pengaturcaraan sebenar, anda boleh menggabungkan kelebihan nombor pseudo-rawak dan nombor rawak benar dan menggunakan beberapa kaedah penjanaan nombor rawak lanjutan untuk meningkatkan kecekapan dan keselamatan program.

Atas ialah kandungan terperinci Penjanaan nombor rawak dalam C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan