2009-07-13 49 views
7

Tôi đang thực hiện một bài tập sách để viết một chương trình tạo ra số psuedorandom. Tôi bắt đầu đơn giản với.Cách nào để sử dụng hàm rand() trong C++?

#include "std_lib_facilities.h" 

int randint() 
{ 
    int random = 0; 
    random = rand(); 
    return random; 
} 

int main() 
{ 
    char input = 0; 
    cout << "Press any character and enter to generate a random number." << endl; 
    while (cin >> input) 
    cout << randint() << endl; 
    keep_window_open(); 
} 

Tôi nhận thấy rằng mỗi khi chương trình được chạy, sẽ có cùng một đầu ra "ngẫu nhiên". Vì vậy, tôi đã xem xét các trình tạo số ngẫu nhiên và quyết định thử hạt giống bằng cách bao gồm lần đầu tiên này trong randint().

srand(5355); 

Mà chỉ cần tạo ra cùng số lặp đi lặp (Tôi cảm thấy ngu ngốc bây giờ cho việc thực hiện nó.)

Vì vậy, tôi nghĩ rằng tôi muốn được thông minh và thực hiện các hạt giống như thế này.

srand(rand()); 

này về cơ bản chỉ làm giống như các chương trình đã làm ở nơi đầu tiên nhưng outputted một bộ khác nhau của con số (có ý nghĩa kể từ khi số đầu tiên được tạo ra bởi rand() luôn luôn là 41.)

điều duy nhất tôi có thể nghĩ ra để làm điều này ngẫu nhiên hơn là:

  1. có người dùng nhập vào một số và thiết lập đó là hạt giống (đó sẽ là dễ thực hiện, nhưng đây là một phương sách cuối cùng) HOẶC
  2. Bằng cách nào đó hạt giống được đặt vào đồng hồ máy tính hoặc một số số thay đổi liên tục khác.

Tôi có thể vượt qua đầu và tôi có nên dừng lại ngay bây giờ không? Tùy chọn 2 có khó thực hiện không? Bất kỳ ý tưởng nào khác?

Xin cảm ơn trước.

Trả lời

27

Lựa chọn 2 không phải là khó khăn, here you go:

srand(time(NULL)); 

bạn sẽ cần phải bao gồm stdlib.h cho srand()time.h cho time().

+8

+1, đây là thực hành tiêu chuẩn. – SingleNegationElimination

+0

Bạn cũng có thể đọc/dev/ngẫu nhiên nếu bạn đang ở trong môi trường * nix; nhưng tôi đồng ý với Token, đây là một thực hành tiêu chuẩn để thiết lập srand với hàm thời gian. – Suroot

+2

Ngoài ra, hãy gọi srand() ở chính gần đầu kể từ khi bạn chỉ nên gọi nó một lần. Đừng gọi nó mỗi khi bạn tạo một số mới. – MahlerFive

6

Thông thường, hãy tạo trình tạo số ngẫu nhiên với thời gian hiện tại. Thử:

srand (thời gian (NULL));

8

srand() chỉ nên được sử dụng một lần:

int randint() 
{ 
    int random = rand(); 
    return random; 
} 

int main() 
{ 
    // To get a unique sequence the random number generator should only be 
    // seeded once during the life of the application. 
    // As long as you don't try and start the application mulitple times a second 
    // you can use time() to get a ever changing seed point that only repeats every 
    // 60 or so years (assuming 32 bit clock). 
    srand(time(NULL)); 
    // Comment the above line out if you need to debug with deterministic behavior. 

    char input = 0; 
    cout << "Press any character and enter to generate a random number." << endl; 

    while (cin >> input) 
    { 
     cout << randint() << endl; 
    } 
    keep_window_open(); 
} 
+0

Tôi chắc chắn sẽ làm điều này. – trikker

4

Vấn đề là nếu bạn không giống các máy phát điện nó sẽ gieo rắc tự với 0 (như thể srand(0) được gọi). Các PRNG được thiết kế để tạo ra cùng một trình tự khi gieo giống nhau (do thực tế là các PNRG không thực sự ngẫu nhiên, chúng là các thuật toán xác định và có thể một chút vì nó khá hữu ích để thử nghiệm).

Khi bạn đang cố gắng để gieo rắc nó với một số ngẫu nhiên sử dụng

srand(rand()); 

bạn có hiệu lực thực hiện:

srand(0); 
x = rand(); // x will always be the same. 
srand(x); 

Như FigBug mentioned, sử dụng thời gian để gieo rắc các máy phát điện là thường đã sử dụng.

+0

Trên thực tế, giá trị ban đầu của hạt giống là 1: "Nếu' rand() 'được gọi trước khi thực hiện bất kỳ lệnh gọi' srand' nào, thì cùng một chuỗi sẽ được tạo ra khi 'srand' được gọi đầu tiên với giá trị hạt giống là 1. " http://www.opengroup.org/onlinepubs/000095399/functions/srand.html –

0

Tôi nghĩ rằng điểm của các bài viết này là phải thực hiện thuật toán trong rand() chứ không phải cách tạo hạt giống hiệu quả.

số ngẫu nhiên sản xuất (giả) là không nhỏ và đáng để nghiên cứu các kỹ thuật tạo ra chúng. Tôi không nghĩ rằng chỉ đơn giản bằng cách sử dụng rand() là những gì các tác giả đã có trong tâm trí.

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