2012-02-23 2 views
8

thể trùng lặp:
What's the Right Way to use the rand() Function in C++?rand() tạo ra cùng số khi biên soạn

Tôi đã học cách sử dụng đồng rand() chức năng và tôi đã viết một trò chơi nhỏ đoán trong C++ như đã thấy dưới đây, nhưng vấn đề là, không có vấn đề bao nhiêu lần tôi biên dịch các chương trình số được tạo ra là như nhau -> 41

#include <iostream> 
#include <cstdlib> 
#include <conio.h> 
using namespace std; 

int main() 
{ 
    int x = rand()%100; 
    int y=0; 
    cout << "Ghiceste numarul!" << endl; 
    cin >> y; 

    while(y != x) { 

     if(y > x) { 
      cout << "Numarul tau este prea mare! Incearca un numar mai mic!" << endl; 
      cin >> y; 
      } 

      if(y < x) { 
       cout << "Numarul tau este prea mic!" << endl; 
       cin >> y; 
       } 

     if (y == x) { 
     cout << "FELICITARI, AI GHICIT NUMARUL!\n"; 
     return 0; 
     } 
    } 
} 

Tôi cũng đã cố gắng thay đổi giá trị lớn nhất của rand() và nó đã thay đổi miễn là tôi đặt nó < 41.

Bất kỳ ý tưởng nào? Tôi không có một đầu mối là tại sao điều này xảy ra. Tôi đang sử dụng CodeBlocks IDE và tôi đã cố gắng xây dựng lại (Ctrl + F11)

+1

+1 cho [SSCCE] (http://sscce.org/). –

Trả lời

11

Hãy thử thêm

srand(time(0)); 

vào đầu main.

+7

Thực hiện việc này, nhưng lưu ý rằng bạn chỉ cần thực hiện một lần vào đầu chương trình của mình. Đừng làm điều đó mỗi khi bạn gọi 'rand()'. – spencercw

+5

Và lưu ý đến báo trước: Nếu bạn chạy chương trình nhiều lần một giây, nó sẽ sử dụng lại các hạt giống ngẫu nhiên (và cung cấp cho bạn các số giống nhau mỗi lần bạn chạy chương trình cho đến khi lần thứ hai trôi qua). –

+0

Cả hai điểm tốt. Hãy chắc chắn để kiểm tra các bài viết SO tham chiếu trong bình luận của tenfour cho câu hỏi của bạn. –

2

có thể sử dụng cùng một hạt giống mỗi lần cho trình tạo số ngẫu nhiên. nếu bạn set the seed of the random number generator mỗi lần đến một giá trị khác, bạn sẽ nhận được các số khác nhau. theo tài liệu:

Để tạo số ngẫu nhiên, nhãn hiệu thường được khởi tạo với một số giá trị đặc biệt, như giá trị liên quan đến thời gian thực hiện. Ví dụ: giá trị được trả về theo thời gian hàm (được khai báo trong tiêu đề ) khác nhau mỗi giây, đủ khác biệt cho hầu hết các nhu cầu gia tăng.

0

Bạn cần chuyển hạt giống đến hàm rand() sẽ khác nhau mỗi khi chương trình được chạy (ví dụ: dấu thời gian). Nói chung, việc tạo ra các số thực sự ngẫu nhiên là không thể nhưng bạn có thể nhận được một giả ngẫu nhiên.

5

Bạn nên cố gắng đầu tiên để khởi tạo một hạt giống cho rand() chức năng như sau:

srand (time(NULL)) 

vào đầu main. Hãy chắc chắn để bao gồm các time.h trong tiêu đề

#include <time.h> 

hoặc

#include <ctime> 
0

Bạn cần để gieo rắc các chức năng rand với srand() vào đầu main, thường sử dụng thời gian(); chức năng

0

Trình tạo số ngẫu nhiên đang được gieo giống với cùng trạng thái mặc định trên mỗi lần chạy chương trình của bạn.

Để nhận các kết quả khác nhau trên mỗi lần chạy, bạn cần tạo trình tạo số ngẫu nhiên trong chương trình của mình bằng cách gọi srand() và chuyển qua một hạt giống mới. Việc sử dụng giá trị trả về là time(NULL) là giống, vì điều đó sẽ đảm bảo rằng bạn nhận được một hạt giống khác nhau trên các chương trình khác nhau của bạn.

Vì vậy, thêm dòng sau vào đầu main:

srand(time(NULL));