2010-10-18 49 views
9

Tôi đã nhận thấy rằng hàm rand() chuẩn này cung cấp các kết quả khác nhau trên Windows và Linux. Ofcourse Tôi đã sử dụng cùng một số hạt giống (1234). Dưới đây là một vài kết quả đầu tiên:các kết quả rand() khác nhau trên Windows và Linux

WIN: 4068 213 12761 8758

LIN: 479142414 465566339 961126155 1057886067

Ứng dụng của tôi đòi hỏi cả hai nền tảng tạo ra giống hệt nhau. Tùy chọn của tôi là gì? Có bất kỳ thay thế tốt nào cho rand() đáp ứng yêu cầu của tôi không?

cảm ơn

PS. Tôi đã sử dụng MSVC 2008 trên Windows7 và gcc 4.1.2 trên CentOS 5.5

+2

Tại sao bạn cần số ngẫu nhiên để giống hệt nhau trên các nền tảng? Đó không phải là rất * ngẫu nhiên *, sau khi tất cả - những gì bạn đang cố gắng để đạt được? –

+0

@EamonNerbonne Kịch bản có thể xảy ra: Ứng dụng được phát triển dưới Linux và Cygwin và được thử nghiệm với thử nghiệm ngẫu nhiên. Hạt giống được in cho mỗi thử nghiệm. Nếu thử nghiệm xác định một điều kiện lỗi, người ta có thể tạo lại trường hợp lỗi với sự trợ giúp của hạt giống.Nếu một trong những muốn gỡ lỗi các trường hợp lỗi trên Linux và Cygwin nó sẽ rất tốt đẹp nếu 'rand' sẽ trở lại cùng một chuỗi ngẫu nhiên dưới Linux và Cygwin. – Tobias

Trả lời

19

Tăng cường có wide range of RNGs, có lẽ với hành vi có thể lặp lại trên các nền tảng.

+0

Tất cả các PRNG của Boost đều có tham chiếu đến thuật toán mà chúng triển khai và các tham số được chọn. Vì vậy, không chỉ hành vi có thể tái sản xuất được, nó cũng sẽ được định nghĩa toán học (tức là có một tiêu chuẩn tuyệt đối cho tính chính xác) – MSalters

4

Bạn sẽ không nhận được kết quả tương tự do việc triển khai khác nhau của các chức năng trên một trong hai nền tảng.

7
  • Viết của riêng bạn (không được khuyến nghị).
  • Sử dụng thư viện. ví dụ. Boost
  • This function
+0

Tại sao “không được khuyến nghị”? LCG là một lớp lót nhỏ, và bài viết trên Wikipedia cung cấp một danh sách các hằng số thường được sử dụng tạo ra nhiều hành vi tốt hơn hoặc ít hơn (ngang bằng với việc triển khai thư viện chuẩn C). –

+5

Không được khuyến nghị vì tính chính xác của quá trình triển khai khó kiểm tra và mọi lỗi không rõ ràng ngay lập tức nhưng có thể gây ra sự cố sau này trong quá trình thực thi ứng dụng. Ngoài ra, tại sao tái tạo lại bánh xe? –

+0

@Eamon: "tại sao lại phát minh ra bánh xe?" Đó là một cái nôi ** một lót **. Tải xuống tiêu đề Tăng cường (mặc dù đây cũng là giải pháp đầu tiên tôi đề xuất) được đảm bảo sẽ hoạt động tốt hơn. Và nói chung tôi đồng ý về tính chính xác. Nhưng một lần nữa: đó là một lớp lót. Mà tôi đã sao chép từ Wikipedia. Có gì để làm sai? –

-4

Bạn có thể thử srand (int), mà tạo ra số ngẫu nhiên dựa trên hạt giống (đầu vào)

- Cheers

+2

Đúng, nhưng kết quả sẽ chỉ giống nhau nếu thuật toán và thông số cơ bản cũng giống nhau. –

3

Tôi nghĩ thậm chí bạn sẽ tìm thấy các phiên bản Linux khác nhau trả về các giá trị khác nhau, cũng như các phiên bản windows khác nhau trả về các giá trị khác nhau.

Bạn có thể hợp nhất trình tạo ngẫu nhiên của mình bằng cách sử dụng glibc, ví dụ.

Một tùy chọn khác cho bạn đang viết chức năng riêng của bạn NHƯNG làm điều đó CHỈ nếu bạn là chắc chắn 100% bạn không cần phải sử dụng ngẫu nhiên của bạn để sử dụng mật mã hoặc sử dụng bất kỳ khác mà đòi hỏi sự điều để có thể tiên đoán hoặc tính đồng nhất hoặc các tính chất ngẫu nhiên khác.

6

Nếu bạn hài lòng với tiêu chuẩn rand thực hiện và chỉ cần reproduceability, bạn có thể dễ dàng viết của riêng bạn linear congruential generator (thích nghi với giao diện C, có lẽ không phải là một lựa chọn tốt - chứ không phải sử dụng một lớp thay!):

namespace myown { 

static int state; 

void srand(int seed) { 
    state = seed; 
} 

int rand() { 
    int const a = 1103515245; 
    int const c = 12345; 
    state = a * state + c; 
    return (state >> 16) & 0x7FFF; 
} 

} 

Điều này sử dụng hằng số (ANSI C: Watcom) từ bài viết trên Wikipedia.

Điều đó nói rằng, tôi muốn đi với một triển khai thực hiện được đọc từ Boost, như được đề xuất bởi những người khác.

+0

+1 cho câu trả lời đúng cho câu hỏi (OP muốn tái tạo khả năng, không phải là RNG tốt). Chỉ cần nhớ sử dụng một RNG tốt khi bạn đã hoàn thành kiểm tra> ;-) – smirkingman

Các vấn đề liên quan