Thông thường khi tôi tạo một bộ tạo số ngẫu nhiên liên tiếp trong C, tôi sử dụng cuộc gọi
srand(time(NULL))
sau đó sử dụng
rand() mod N
để có được một số nguyên ngẫu nhiên trong khoảng từ 0 đến N-1. Tuy nhiên, khi tôi thực hiện việc này song song, các lệnh gọi thời gian (NULL) rất gần nhau và cuối cùng chúng có cùng một số.
Tôi đã thử sử dụng một trình tạo số ngẫu nhiên đồng quy tuyến tính:
cho một số số nguyên và .
Tôi biết rằng việc chọn cho một số nguyên lớn tạo ra kết quả nhanh vì toán tử mô đun có thể được tính bằng cách cắt các chữ số. Tuy nhiên, tôi thấy khó khăn khi thiết lập các hạt tạo ra các chuỗi ngẫu nhiên với một khoảng thời gian lớn song song. Tôi biết rằng một khoảng thời gian là tối đa nếu
- c và m là các số nguyên tố liên quan đến nhau
- a - 1 chia hết cho tất cả các thừa số nguyên tố của m
- nếu m là bội của 4 thì a - 1 cũng phải là bội của 4.
(nguồn: wikipedia )
Nhưng làm thế nào để tôi đảm bảo rằng tất cả các luồng số ngẫu nhiên có thuộc tính tối đa này? Về khía cạnh MPI, làm cách nào để kết hợp rank
và size
tạo ra các khoảng thời gian tối đa bằng cách sử dụng phương pháp cộng hưởng tuyến tính? Sẽ dễ dàng hơn khi sử dụng Fibros Lagled hoặc Mersenne Twister để tạo ra các luồng ngẫu nhiên song song dài hơn?
mod
để lấy các bit thứ tự thấp - như Jonathan Dursi đề xuất, chúng ít ngẫu nhiên hơn nhiều. Thay vào đó hãy chia số ngẫu nhiên (int) của bạn cho maxint / phạm vi để có được phạm vi bạn cần. Bạn phải trả một khoản tiền chia, nhưng có lẽ đó là một lựa chọn rẻ hơn để cải thiện chất lượng của luồng số ngẫu nhiên của bạn so với chuyển sang PRNG khác.