2012-11-07 13 views
9

tôi có phương pháp sau đó tạo ra một số ngẫu nhiên:rand() luôn trả về cùng một chuỗi trên ứng dụng khởi động lại

int random_number() //Random number generator 
{ 
    int x = rand() % 1000000 + 1; //Generate an integer between 1 and 1000000 
    return x; 
} 

Các cuộc gọi đến phương pháp này được sử dụng trong một vòng lặp mà lặp gấp năm lần. Vấn đề với phương pháp này là nó luôn luôn có vẻ tạo ra các con số tương tự khi chạy chương trình nhiều lần. Làm thế nào điều này có thể được giải quyết?

+3

['srand()'] (http://www.cplusplus.com/reference/clibrary/cstdlib/srand/) có thể hữu ích.Tuy nhiên, bạn có thể chán nản khi dùng modulo đó khi/nếu bạn phát hiện ra 1000000 là lớn hơn đáng kể so với hầu hết các định nghĩa thực hiện của [RAND_MAX] (http://www.cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/). – WhozCraig

Trả lời

17

Bạn cần phải seed các bộ tạo số ngẫu nhiên, chẳng hạn như:

srand (time(NULL)); 
int x = rand() % 1000000 + 1; 

Seeding máy phát điện số giả ngẫu nhiên về cơ bản quyết định về số ngẫu nhiên thiết rằng nó sẽ lặp qua. Sử dụng thời gian là phương pháp chuẩn để đạt được kết quả ngẫu nhiên đầy đủ.

EDIT:

Để làm rõ, bạn nên gieo rắc một lần duy nhất và nhận được nhiều số ngẫu nhiên, một cái gì đó như thế này:

srand (time(NULL)); 
loop { 
    int x = rand() % 1000000 + 1; 
} 

Thay vì một cái gì đó như:

loop { 
    //Particularly bad if this line is hit multiple times in one second 
    srand (time(NULL)); 
    int x = rand() % 1000000 + 1; 
} 
+0

Đề xuất của bạn đã hoạt động nhưng có vẻ như số không thay đổi từ vòng lặp này sang vòng lặp tiếp theo. Do đó tất cả các tập tin cuối cùng có cùng tên – Matthew

+0

Nếu bạn đang lặp lại một vòng lặp, không gọi srand trên mỗi lần lặp. Gọi nó chỉ một lần, và vô số lần. Nếu bạn gọi cả hai lần, bất kỳ cuộc gọi nào trong cùng một giây sẽ trả lại cùng một số (vì thời gian (NULL) sẽ trả lại cùng một giá trị). – femtoRgon

+0

Cảm ơn. Điều đó giải quyết được vấn đề :) – Matthew

5

gọi điện đến srand(time(NULL)); khi chương trình của bạn khởi chạy.

srand đặt hạt giống thành hàm rand. Cung cấp cho nó giá trị trả về là time(NULL) giúp nhận được một hạt giống khác nhau trong mỗi lần chạy chương trình.

Khi bạn gắn thẻ câu hỏi của mình là C++, bạn có thể sử dụng tính năng C++ 11 để xử lý thế hệ số random.

+0

Đề xuất của bạn đã hoạt động. Tuy nhiên, tất cả năm tệp bây giờ đều có cùng tên: s – Matthew

+1

tệp nào (bạn đang nói đến)? – tomahh

1

femtoRgon là đúng . Điều này sẽ gieo rắc chương trình nhưng hãy nhìn vào các tiêu chuẩn mới C++ như họ đã được cải thiện hệ số ngẫu nhiên thấy

Random numbers in C++0x

1

rand là không thực sự là một số ngẫu nhiên, mà là một giả ngẫu nhiên mà chỉ là " trông "ngẫu nhiên nếu bạn không biết thuật toán được sử dụng để tạo ra các giá trị. Từ trang người đàn ông:

Đồng rand() Hàm trả về một số nguyên giả ngẫu nhiên trong khoảng từ 0 đến RAND_MAX bao gồm phương tiện

giả ngẫu nhiên mà cho đầu vào tương tự, được gọi là một hạt giống, nó sẽ cho cùng một đầu ra. Điều này thực sự khá hữu ích khi bạn đang cố gắng gỡ lỗi một vấn đề vì các giá trị "ngẫu nhiên" giống nhau sẽ được trả về, cho phép bạn tạo lại vấn đề. Thật tệ nếu bạn thực sự cần sự ngẫu nhiên.

Như đã lưu ý ở trên bằng cách thay đổi hạt giống thành thứ gì đó khác nhau trên mỗi lần chạy, như số giây kể từ thời đại, bạn có thể nhận các giá trị khác nhau từ cuộc gọi đến rand().

srand(time(NULL)) 

Nếu bạn đang cố gắng gỡ lỗi, bạn có thể muốn in ra hạt giống để bạn có thể tạo lại sự cố nếu chúng xảy ra.