Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menjana Integer Rawak Teragih Seragam dalam C?

Bagaimanakah Saya Boleh Menjana Integer Rawak Teragih Seragam dalam C?

Barbara Streisand
Barbara Streisandasal
2024-12-24 20:17:11859semak imbas

How Can I Generate Uniformly Distributed Random Integers in C  ?

Menjana Integer Rawak Teragih Seragam

Apabila membangunkan perisian, menjana integer rawak dalam julat yang ditentukan adalah tugas biasa. Walau bagaimanapun, mencari penjana nombor rawak yang cepat dan diedarkan secara seragam boleh menjadi mencabar. Dalam artikel ini, kami menangani isu ini dengan meneroka pelbagai pendekatan untuk menjana integer rawak dalam julat tertentu.

Pendekatan Mudah

Kaedah biasa untuk menjana integer rawak ialah menggunakan rand() fungsi. Walau bagaimanapun, seperti yang dinyatakan dalam soalan asal, rand() boleh membawa kepada pengedaran berat sebelah, terutamanya untuk julat kecil.

Untuk menangani isu ini, formula alternatif telah dicadangkan:

( (max - min) * rand() + (RAND_MAX / (2 * (max - min))) ) / RAND_MAX

Walaupun formula ini menyediakan pengedaran yang lebih seragam, ia masih gagal untuk menangani semua keperluan, iaitu, kelajuan, pengedaran seragam, julat berubah, dan kebolehbenihan.

Perpustakaan Standard C untuk Penyelamat

Memperkenalkan fungsi perpustakaan standard C std::uniform_int_distribution dan penjana nombor rawak yang berkaitan std::mt19937. Pendekatan ini mudah, pantas dan memberikan hasil yang tidak berat sebelah.

#include <random>

std::random_device rd;
std::mt19937 rng(rd());
std::uniform_int_distribution<int> uni(min,max);

auto random_integer = uni(rng);

std::random_device memulakan penjana dengan sumber entropi sebenar, memastikan nombor yang dijana tidak dapat diramalkan dan rawak. Std::uniform_int_distribution mentakrifkan julat integer yang akan dijana, menjamin bahawa semua nilai dalam julat itu mempunyai kebarangkalian yang sama untuk dipilih.

Pendekatan ini memenuhi semua keperluan:

  • Kelajuan: Pelaksanaan perpustakaan standard sangat cekap, walaupun untuk menjana sejumlah besar rawak nombor.
  • Taburan seragam: Fungsi std::uniform_int_distribution memastikan taburan nombor yang dijana tidak berat sebelah dan seragam.
  • Julat pembolehubah: Taburan boleh disesuaikan kepada mana-mana julat integer dengan menetapkan min dan parameter maks.
  • Kebolehbenihan: Parameter rd menyediakan cara untuk menyemai penjana dengan nilai, membolehkan kebolehulangan.

Penyelesaian Unggul

Kesimpulannya, pendekatan paling mudah dan terbaik untuk menjana integer rawak teragih seragam dalam C ialah menggunakan std::uniform_int_distribution dan std :: fungsi mt19937. Pendekatan ini memanfaatkan algoritma yang dioptimumkan bagi perpustakaan standard, memastikan kedua-dua kelajuan dan rawak.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjana Integer Rawak Teragih Seragam dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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