Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menjana Nombor Rawak Unik dalam Berbilang Benang Menggunakan Fungsi `rand()` C?

Bagaimanakah Saya Boleh Menjana Nombor Rawak Unik dalam Berbilang Benang Menggunakan Fungsi `rand()` C?

Barbara Streisand
Barbara Streisandasal
2024-12-16 09:28:14981semak imbas

How Can I Generate Unique Random Numbers in Multiple Threads Using C's `rand()` Function?

Penggunaan Berbilang Ulir rand() stdlib

Dalam senario pengaturcaraan berbilang benang, selalunya perlu menjana nombor rawak dalam urutan berasingan. Walau bagaimanapun, apabila menggunakan fungsi rand() perpustakaan standard, anda mungkin menghadapi masalah jika tidak dikendalikan dengan betul.

Isu

Berbilang utas yang melaksanakan fungsi yang sama menghasilkan nombor rawak yang sama berulang kali. Ini kerana setiap urutan biasanya mempunyai salinan data globalnya sendiri, termasuk keadaan dalaman rand(), yang dikongsi oleh semua urutan.

Penyelesaian

Untuk mengelak daripada menjana nombor rawak yang sama , adalah perlu untuk mengurus secara eksplisit keadaan dalaman rand(). Dokumentasi mengesyorkan yang berikut:

  • Gunakan rand_r() dengan Penunjuk Keadaan Eksplisit: rand_r() menyediakan versi rand() selamat benang dengan membenarkan anda lulus penunjuk kepada integer tidak bertanda yang akan digunakan sebagai keadaan.
  • Gunakan drand48_r(3) untuk Pilihan yang Lebih Lemah tetapi Selamat Benang: drand48_r(3) ialah penjana rawak pseudo-rawak selamat benang alternatif yang menggunakan keadaan dalaman yang lebih besar.

Contoh Penggunaan

Sebagai contoh, untuk menggunakan rand_r() dalam persekitaran berbilang benang, anda boleh:

#include <stdlib.h>

void* thread_function(void* arg) {
  unsigned int state = 0;  // Thread-specific state
  while (1) {
    int random_number = rand_r(&state);
    // Do something with random_number
  }
  return NULL;
}

Nota Penting

Perlu diambil perhatian bahawa menggunakan rand() atau rand_r() tanpa penyegerakan benang yang betul boleh membawa kepada tingkah laku yang tidak dapat diramalkan dan hasil yang salah. Sentiasa pastikan mekanisme penyegerakan yang betul disediakan untuk mengendalikan akses berbilang benang kepada sumber yang dikongsi, termasuk penjana nombor rawak.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjana Nombor Rawak Unik dalam Berbilang Benang Menggunakan Fungsi `rand()` 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