Cho đến nay tôi đã sử dụng C# Mersenne Twister tìm thấy ở đây để tạo ra số ngẫu nhiên:C# Mersenne Twister số nguyên ngẫu nhiên thực hiện phát (SFMT) monte carlo mô phỏng
http://www.centerspace.net/resources.php
Tôi chỉ phát hiện SFMT đó là nghĩa vụ phải được gấp đôi so với ở đây nhanh:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/
Có ai có thể chỉ cho tôi tại triển khai C# của SFMT không?
Yêu cầu của tôi là tạo số nguyên giữa (và bao gồm) 0 và 2^20 (1048576).
Tôi cần làm điều này nghìn tỷ lần mỗi ngày cho mô phỏng chạy trên đồng hồ 24 giờ vì vậy tôi sẵn sàng dành hàng ngày để tinh chỉnh điều này cho sự hoàn hảo.
Hiện nay tôi đã điều chỉnh Trung tâm Vũ trụ Mersenne Twister bằng cách thêm một phương pháp mới để phù hợp với yêu cầu của tôi:
public uint Next20()
{
return (uint)(genrand_int32() >> 12);
}
Sử dụng phương pháp genrand_int32()
Tôi muốn tạo ra phiên bản của riêng tôi, genrand_int20()
, mà tạo ra một số nguyên giữa (và bao gồm) 0 và 2^20 để lưu trên số truyền ở trên và dịch nhưng tôi không hiểu toán học. Chính xác làm thế nào tôi có thể làm điều này?
Cũng đang sử dụng uint sẽ nhanh hơn int hoặc chỉ là vấn đề số địa chỉ? Bởi vì tôi chỉ cần lên đến 1048576, tôi chỉ quan tâm đến tốc độ.
Điều này cũng sẽ chạy trên một hộp Windows Server 2003 R2 SP2 (32 bit) với .NET 2. Bộ vi xử lý là AMD Opteron 275 (4 lõi).
Một số 20-bit sẽ đại diện cho khoảng 0-2^20-1 bao gồm, 2^20 yêu cầu 21 bit để đại diện (1 được theo sau bởi 20 số không) –
Nifle: Đừng nhầm lẫn * dấu * của trình tạo (là độ dài của chuỗi) với một khoảng * * mà bạn muốn số ngẫu nhiên. – Joey
@ Patrick cảm ơn bạn là đúng 2^20-1 là những gì tôi cần, tôi cần phải ngẫu nhiên chỉ mục vào một mảng chiều dài 2^20. – m3ntat