2013-07-24 39 views
12
#include <stdio.h> 
#include <stdlib.h> 

int main() 

{ 
    int randomnumber; 
    randomnumber = rand() % 10; 
    printf("%d\n", randomnumber); 
    return 0; 
} 

Đây là một chương trình đơn giản mà randomNumber là một int biến chưa được khởi đó có nghĩa là để được in như một số ngẫu nhiên giữa 1 và 10. Tuy nhiên, nó luôn luôn in cùng số bất cứ khi nào tôi chạy hết lần này đến lần khác. Ai đó có thể giúp đỡ và cho tôi biết tại sao điều này xảy ra? Cảm ơn bạn.tạo ra một số ngẫu nhiên từ 1 đến 10 trong c

+6

đọc về [ 'srand()'] (http: // en. cppreference.com/w/c/numeric/random/srand). – jxh

+2

Bạn rất có thể có thiên vị trong lựa chọn đó. – chris

+2

@chris: Có nhưng sự thiên vị trong trường hợp này là khá nhỏ; vì 'RAND_MAX' có ít nhất 32767, độ lệch nhỏ hơn một phần trong 3000, và nếu bạn cần số ngẫu nhiên có chất lượng tốt hơn thì bạn nên sử dụng cái gì đó tốt hơn' rand() '. Tuy nhiên, nó có thể là giá trị giải quyết, đặc biệt là nếu bạn muốn có một phạm vi lớn hơn (gần với 'RAND_MAX'). Câu hỏi 13.16 của [comp.lang.c FAQ] (http://www.c-faq.com/) cho thấy cách thực hiện điều này. –

Trả lời

13

Bạn cần một hạt giống khác tại mỗi lần thực thi.

Bạn có thể bắt đầu gọi vào đầu chương trình của bạn:

srand(time(NULL)); 

Lưu ý rằng % 10 mang lại một kết quả 0-9 và không 1-10: chỉ cần thêm 1 để biểu % của bạn để có được 1 đến 10.

+0

cảm ơn nhưng khi tôi thêm srand (thời gian (NULL)); ngay sau khi tôi khai báo biến ngẫu nhiên, trình biên dịch cho tôi lỗi chuyển đổi ẩn mất độ chính xác nguyên: 'time_t (aka' long ') thành' unsigned int ' – Nisarg

+1

@Nisarg; Sử dụng 'srand ((unsigned) time (NULL))'. 'srand()' nhận giá trị 'unsigned' làm đối số. – haccks

+0

@Nisarg bạn có thể bỏ qua thông báo này một cách an toàn hoặc đưa đối số hàm vào 'unsigned int' để tắt tiếng. – ouah

1

Bạn cần để gieo rắc các bộ tạo số ngẫu nhiên, từ man 3 rand

Nếu không có giá trị hạt giống được cung cấp, các rand() chức năng được tự động hạt với giá trị là 1.

Hàm srand() đặt đối số của nó làm hạt giống cho một chuỗi các số nguyên giả ngẫu nhiên mới được rand() trả về. Các chuỗi này có thể lặp lại bằng cách gọi srand() với cùng giá trị hạt giống.

ví dụ:

srand(time(NULL)); 
+0

cảm ơn lời giải thích! – Nisarg

0

Tạo một số ngẫu nhiên trong chương trình là vấn đề. Các trình tạo số ngẫu nhiên chỉ là "ngẫu nhiên" theo nghĩa là các lời gọi lặp đi lặp lại tạo ra các số từ một phân phối xác suất đã cho.

Việc gieo hạt RNG sẽ không hữu ích, đặc biệt nếu bạn chỉ gieo hạt giống từ bộ hẹn giờ có độ phân giải thấp. Bạn sẽ chỉ nhận được các số là hàm băm của thời gian và nếu bạn thường xuyên gọi chương trình, chúng có thể không thay đổi thường xuyên. Bạn có thể cải thiện một chút bằng cách sử dụng srand(time(NULL) + getpid()) (_getpid() trên Windows), nhưng điều đó vẫn không phải ngẫu nhiên.

Cách duy nhất để nhận các số ngẫu nhiên qua số nhiều lời gọi của chương trình là nhận chúng từ bên ngoài chương trình. Điều đó có nghĩa là sử dụng dịch vụ hệ thống như /dev/random (Linux) hoặc CryptGenRandom() (Windows) hoặc từ một dịch vụ như random.org.

+0

cảm ơn lee làm bạn biết làm thế nào để sử dụng một dịch vụ hệ thống để có được một máy phát điện số ngẫu nhiên legit trên một MAC? FYI: Tôi đang sử dụng Xcode. – Nisarg

+0

Tôi không phải là một anh chàng Mac, nhưng tôi tin rằng họ là Unix giống như đủ rằng họ có một '/ dev/random' hoặc'/dev/urandom'. –

+0

không sao, lee. cảm ơn. – Nisarg

0

Dưới đây là sẵn sàng chạy mã nguồn cho trình tạo số ngẫu nhiên bằng cách sử dụng c được lấy từ trang web này: http://www.random-number.com/random-number-c/ . Việc thực hiện ở đây là tổng quát hơn (một chức năng mà được 3 thông số: min, max và số lượng các số ngẫu nhiên để tạo ra)

#include <time.h> 
#include <stdlib.h> 
#include <stdio.h> 

// the random function 
void RandomNumberGenerator(const int nMin, const int nMax, const int nNumOfNumsToGenerate) 
{ 
    int nRandonNumber = 0; 
    for (int i = 0; i < nNumOfNumsToGenerate; i++) 
    { 
    nRandonNumber = rand()%(nMax-nMin) + nMin; 
    printf("%d ", nRandonNumber); 
    } 
    printf("\n"); 
} 

void main() 
{ 
    srand(time(NULL)); 
    RandomNumberGenerator(1,70,5); 
} 
0
srand(time(NULL)); 

int nRandonNumber = rand()%((nMax+1)-nMin) + nMin; 
printf("%d\n",nRandonNumber); 
Các vấn đề liên quan