2012-02-12 77 views
5

Tôi có vòng lặp for chạy 15 lần, với dh.setDoors() trong mỗi lần lặp lại.Các số ngẫu nhiên giống nhau lặp lại vòng lặp

Điều gì setDoors gọi là srand(time(0)), sau đó bất cứ khi nào cần có số ngẫu nhiên, số này sẽ sử dụng, ví dụ: carSetter = rand()%3+1. Ngoài ra, nó có thể sử dụng decider = rand()%2+1.

Hiện tại, thông thường decidercarSetter được sử dụng theo nhiều cách khác nhau, nhưng tôi nghi ngờ có vấn đề và in ra carSetterdecider ở mọi lần lặp lại. Dưới đây là những gì xuất hiện:

Door 1 has car 
Decider is 2 
Door 1 has car 
Decider is 2 
Door 1 has car 
Decider is 2 
Door 1 has car 
Decider is 2 
Door 1 has car 
Decider is 2 
etc... 

Thay đổi giá trị '1' và '2' khi tôi chạy nhiều lần, nhưng vẫn giữ nguyên trong 15 lần.

Vì vòng lặp đang chạy 15 lần khác nhau, không nên carSetterdecider in ra một số ngẫu nhiên khác nhau mỗi lần lặp?

Khi tôi không có srand(time(0)), nó hoạt động như mong đợi, nhưng không có bộ hạt giống, do đó, nó cùng một chuỗi số "ngẫu nhiên" mỗi lần, vì vậy có thể là vấn đề với hạt giống?

+9

Việc gieo hạt phải được thực hiện * một lần *, bao giờ hết. Tìm hiểu về cách thức các trình tạo số giả ngẫu nhiên hoạt động, và có thể tốt hơn nếu bạn tìm hiểu một số lý thuyết xác suất trong khi bạn đang ở đó. –

+0

Tôi chỉ sử dụng srand một lần trong setDoors, setDoors chỉ được lặp lại 15 lần. Vấn đề mà srand đang được lặp lại 15 lần? – GlassZee

+0

Sẽ dễ dàng hơn khi mô tả giải pháp khi bạn * đăng mã thực của bạn *. –

Trả lời

12

Khi bạn gọi srand(x), thì giá trị của x xác định trình tự của các số giả ngẫu nhiên trở lại trong các cuộc gọi sau đây để rand(), tùy thuộc hoàn toàn vào giá trị của x.

Khi bạn đang ở trong một vòng lặp và gọi srand() ở đầu trang:

while (...) { 
    srand(time(0)); 
    x = rand(); 
    y = rand(); 
} 

thì cùng dãy số ngẫu nhiên được tạo ra tùy thuộc vào giá trị mà time(0) lợi nhuận. Vì máy tính chạy nhanh và vòng lặp của bạn có thể chạy trong chưa đầy một giây, nên time(0) trả về giá trị cùng một giá trị mỗi lần qua vòng lặp. Vì vậy, xy sẽ giống nhau mỗi lần lặp lại.

Thay vào đó, bạn chỉ thường cần phải gọi srand()lần lúc bắt đầu chương trình của bạn:

srand(time(0)); 

while (...) { 
    x = rand(); 
    y = rand(); 
} 

Trong trường hợp trên, xy sẽ có giá trị khác nhau mỗi lần thông qua các vòng lặp.

+0

* Đặt trên đôi giày psuedo màu xanh của tôi ... * –

1

Bạn cần chạy srand khi bắt đầu chương trình, ví dụ: trong số main-chức năng.

Khi bạn chạy srand(time(0)) ở đầu hàm mà bạn đang sử dụng rand(), bạn có khả năng cung cấp hạt giống giống nhau mỗi lần. time(0) cho thời gian tính bằng giây, vì vậy bạn cần phải tránh gọi số setDoors hai lần trong cùng một giây để nhận các số khác nhau mỗi lần. Nếu bạn làm gọi setDoors hai lần trong cùng một giây, hạt giống ngẫu nhiên sẽ giống nhau và các cuộc gọi tiếp theo đến rand() sẽ tạo ra cùng một chuỗi số giả ngẫu nhiên.

2

Giống như Kerrek cho biết, việc gieo hạt chỉ được thực hiện một lần, vào đầu chương trình. Sau khi một cuộc gọi thương hiệu rand nhiều lần như bạn muốn.

1

Mỗi khi bạn gọi srand(time(0)), bạn đang gieo trình tạo số giả ngẫu nhiên, thực hiện nó bằng một chuỗi số ngẫu nhiên giả mới. Trình tự là khác nhau tùy thuộc vào những gì các đối số để srand là, và trong trường hợp này bạn sử dụng time(0) vì vậy, giả sử bạn gọi chương trình của bạn nhiều nhất một lần mỗi giây, bạn sẽ luôn luôn nhận được một trình tự mới. Khi bạn gọi rand(), bạn chỉ nhận được số tiếp theo trong chuỗi này.

Tuy nhiên, vì bạn đã quyết định gọi srand nhiều lần trong chương trình của mình và vì chương trình của bạn nhanh (tức là time(0) không thay đổi), tất cả những gì bạn đang làm là đặt lại PRNG nhiều lần cho cùng một chuỗi. Đó là lý do tại sao bạn luôn nhận được các giá trị giống nhau - bạn tiếp tục chèn lại PRNG để có cùng trình tự và điều này cũng di chuyển con trỏ đến đầu chuỗi.

Hạt giống một lần. Một lần.

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