2012-04-05 31 views
6

Hãy chương trình sau đây:rand thay đổi giá trị mà không thay đổi hạt giống

#include <cstdlib> 
using std::rand; 

#include <iostream> 
using std::cout; 

int main() 
{ 
    cout << rand() << ' ' << rand() << ' ' << rand() << '\n'; 
} 

Do rand sản xuất cùng các giá trị càng lâu càng hạt giống là không thay đổi sử dụng srand, điều này sẽ tạo ra ba số giống hệt nhau.
ví dụ:

567 567 567 

Tuy nhiên, khi tôi chạy chương trình này, nó cung cấp cho tôi ba giá trị khác nhau.
ví dụ:

6334 18467 41 

Khi chương trình được (biên dịch và) chạy lại, cùng ba số được tạo. Tôi có nên sử dụng srand để thay đổi hạt giống trước khi tôi bắt đầu nhận được các kết quả khác nhau từ rand không? Đây có phải là trình biên dịch/triển khai của tôi đang cố gắng giúp tôi không?

Hệ điều hành: Windows XP
Compiler: GCC 4.6.2
Libraries: MinGW

EDIT: Bằng cách cố gắng sử dụng srand, tôi phát hiện ra rằng đây là kết quả từ một hạt giống trong tổng số 1 (mà tôi đoán được tạo mặc định).

+5

+1 cho chương trình mẫu ngắn, hoàn chỉnh. 1 để hiển thị những gì chương trình tạo ra. 1 để hiển thị những gì bạn mong đợi nó để sản xuất. –

+0

Bạn đang đề xuất rằng trình tạo số ngẫu nhiên sẽ cần phải được tạo hạt trước mỗi cuộc gọi đến rand? Điều đó nghe có vẻ giống với số người dùng được tạo hơn số được tạo ngẫu nhiên. –

+0

Nếu tất cả các lần xuất hiện của 'rand' trong một hàm cho cùng một kết quả, nó sẽ không hữu ích chút nào. – hjpotter92

Trả lời

4

Mỗi cuộc gọi đến rand() sẽ luôn tạo một số ngẫu nhiên khác.

Hạt giống thực sự xác định chuỗi các số ngẫu nhiên được tạo. Sử dụng một hạt giống khác sẽ giúp bạn có 3 số ngẫu nhiên khác, nhưng bạn sẽ luôn nhận được 3 số đó cho một hạt giống đã cho.

Nếu bạn muốn có cùng số nhiều lần chỉ cần gọi rand() một lần và lưu nó vào một biến.

+2

Các cuộc gọi khác nhau tới rand() có thể trả lại cùng một giá trị. –

+0

Đây thực sự là trường hợp. Tôi đã nghĩ về nó khác nhau mỗi cuộc gọi thay vì mỗi lần thực hiện. Cấp rằng thực sự một hạt giống nhất định có thể kết thúc bằng toán học tạo ra ba số giống nhau. – chris

+1

David bạn hoàn toàn đúng, tôi chỉ thấy nó đủ hiếm mà nó không đáng nhắc đến cho việc này. Tôi nên nói rằng nó luôn luôn là (giả) ngẫu nhiên, cho dù đó là thực sự cùng một số hay không. – ThomasG

4

Gọi rand() nhiều lần cố ý tạo khác nhau số ngẫu nhiên mỗi lần bạn gọi.

Trừ khi chương trình của bạn gọi srand() với giá trị khác nhau cho mỗi lần chạy, chuỗi sẽ giống nhau cho mỗi lần chạy.

Bạn có thể sử dụng srand() cùng với thời gian để làm cho toàn bộ chuỗi khác nhau mỗi lần. Bạn cũng có thể gọi srand() với giá trị đã biết để đặt lại chuỗi - hữu ích cho việc thử nghiệm.

Xem tài liệu cho rand()srand().

+1

rand() có thể trả về cùng một số 3 lần liên tiếp. –

+0

Đó là vấn đề của tôi. Tôi phải đưa ra tín dụng cho ThomasG là người đầu tiên đăng câu trả lời giải thích sai lầm trong quá trình suy nghĩ của tôi. – chris

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