2011-11-29 35 views
7

Tôi đã viết mã C dưới đây, khi tôi lặp lại, nó trả về một số ngẫu nhiên. Làm thế nào tôi có thể đạt được 5 giá trị ngẫu nhiên khác nhau nếu myrand() được thực thi?rand với hạt giống không trả về ngẫu nhiên nếu hàm looped

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

int myrand() { 
    int ue_imsi; 
    int seed = time(NULL); 
    srand(seed); 
    ue_imsi = rand(); 

    return ue_imsi; 
} 

int main() 
{ 
    int value = 0; 
    int i=0; 
    for (i=0; i< 5; i++) 
    { 
     value =myrand(); 
     printf("value is %d\n", value); 
    } 
} 
+8

Hạt giống ** một lần ** trong cuộc sống của bạn, không phải lúc nào. –

+0

Bạn đang khởi tạo trình tạo số ngẫu nhiên với cùng một số lặp đi lặp lại (miễn là 'thời gian (NULL)' trả về cùng một giá trị). Đừng làm điều đó nếu bạn muốn các con số trông giống như ngẫu nhiên. Cũng nên nhớ '#include ' cho 'thời gian()' nguyên mẫu. – pmg

+1

có thể trùng lặp của [Số lặp lại luôn được đưa ra bởi rand()] (http://stackoverflow.com/questions/4859089/always-repeated-numbers-given-by-rand). Vui lòng sử dụng các cơ sở tìm kiếm của SO trước khi đặt câu hỏi. –

Trả lời

19

Seeding máy phát điện nên được thực hiện một lần (đối với mỗi chuỗi các số ngẫu nhiên bạn muốn tạo của Tất nhiên):

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

int main() 
{ 
    int seed = time(NULL); 
    srand(seed); 
    int value = 0; 
    int i=0; 
    for (i=0; i< 5; i++) 
    { 
     value =rand(); 
     printf("value is %d\n", value); 
    } 
} 
+0

rand() có thể có thời gian thấp nên tôi vẫn gọi srand từ lần này đến lần khác (nếu trong vòng lặp lớn) –

4

Di chuyển srand() gọi vào main(), trước khi vòng lặp.

Nói cách khác, hãy gọi srand() một lần và sau đó gọi rand() lặp đi lặp lại, không có bất kỳ cuộc gọi hơn nữa để srand():

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

int main() 
{ 
    int value = 0; 
    int i = 0; 
    srand(time(NULL)); 
    for (i = 0; i < 5; i++) 
    { 
     value = rand(); 
     printf("value is %d\n", value); 
    } 
} 
+0

errr. vâng nó hoạt động. nhưng tại sao? – xambo

+2

@xambo: Khi bạn gọi 'time()' nhiều lần liên tiếp, nó có khả năng trả về cùng một giá trị, vì đồng hồ không được đánh dấu. Khi bạn gọi 'srand()' với cùng một hạt giống, lệnh gọi tới 'rand()' sẽ trả về cùng một giá trị. Như tôi đã nói, đừng cố gắng khởi động lại máy phát điện mỗi khi bạn cần một giá trị ngẫu nhiên. – NPE

0

điểm giống() là để bắt đầu chuỗi các số ngẫu nhiên với một giá trị đã biết,
bạn sau đó sẽ luôn luôn nhận được cùng một dãy số cho cùng một hạt giống.

Đây là lý do tại sao bạn có hạt giống(), nó vừa cho phép bạn tạo ra cùng một chuỗi để thử nghiệm, hoặc cho một hạt giống ngẫu nhiên (thường là thời gian) bạn sẽ có được một chuỗi khác nhau mỗi lần

2

Hãy thử điều này:

#include <stdio.h> 
#include <time.h> 
int main(void) { 
    for (int i = 0; i < 10; i++) { 
     printf("%ld\n", (long)time(NULL)); 
    } 
} 

của tôi "đoán" là 10 giá trị tương đương sẽ được in :)

+0

Đây không phải là câu trả lời. (_Nhưng nó giải thích một phần vấn đề của mình với OP_) – JeromeJ

-1

Nếu bạn muốn gieo hạt (ví thêm ngẫu nhiên) mỗi khi bạn gọi random(), đây là một cách để bạn có thể làm tha t:

srandom(time(0)+clock()+random()); 
  • time() cập nhật một lần mỗi giây, nhưng sẽ khác nhau mỗi khi bạn chạy chương trình của bạn
  • clock() cập nhật nhiều thường xuyên hơn, nhưng bắt đầu từ 0 mỗi khi bạn chạy chương trình của bạn
  • random() đảm bảo rằng bạn (thường) không được reseed với cùng một giá trị hai lần liên tiếp nếu vòng lặp của bạn nhanh hơn mức độ chi tiết của clock()

Tất nhiên bạn có thể làm nhiều hơn nếu bạn thực sự, thực sự, muốn sự ngẫu nhiên - nhưng đây là một sự khởi đầu.

+0

Rất tiếc - bằng cách sử dụng 'clock()' không thêm nhiều giá trị ở đây vì nó gần như xác định nếu chương trình của bạn không có bất kỳ sự chậm trễ I/O nào. – nobar

+0

Vâng, trừ khi bạn bằng cách nào đó liên tục nhận được 0, đồng hồ sẽ thêm ít nhất một số bit phụ của entropy, do đó, nó quan trọng. – this

+0

http://scruss.com/blog/2008/10/12/pgmrnoise-a-more-random-or-less-repeatable-pgmnoise/ – nobar

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