Tôi đang nói về this thực hiện đáng ngạc nhiên đơn giản của rand()
từ tiêu chuẩn C:Tại sao 1103515245 được sử dụng trong rand?
static unsigned long int next = 1;
int rand(void) /* RAND_MAX assumed to be 32767. */
{
next = next * 1103515245 + 12345;
return (unsigned)(next/65536) % 32768;
}
Từ this Wikipedia article chúng ta biết rằng nhân a
(trong mã trên a = 1103515245
) nên thực hiện chỉ có 2 điều kiện:
a - 1
có thể chia hết cho tất cả các yếu tố chính củam
.
(Trong trường hợp của chúng tôim = 2^32
, kích thước của int, vì vậym
chỉ có một thừa số nguyên tố = 2)a - 1
là bội số của 4 nếum
là bội số của 4.
(32768 là bội số của 4 và 1103515244 too)
Tại sao họ đã chọn một điều lạ, khó nhớ ", tôi bị chán với những con số ngẫu nhiên này, viết bất kỳ số nào", như 1103515245?
Có thể có một số lý do khôn ngoan, rằng con số này bằng cách nào đó tốt hơn cái kia?
Ví dụ: tại sao không đặt a = 20000000001
? Nó to hơn, đẹp hơn và dễ nhớ hơn.
@Ed S. bộ tạo số ngẫu nhiên (1976) : đủ câu hỏi hợp lý để yêu cầu một số ma thuật được giải thích ... – gbn
:) Tất nhiên là không, nhưng hãy nhìn vào số 12345. Khi họ đang chọn số dễ, đẹp, 12345, một khi xấu ... wit hout một lý do? :) –
Bạn có thể bắt đầu bằng cách xem các tài liệu tham khảo, các câu trả lời có thể ở đâu đó: http://en.wikipedia.org/wiki/Linear_congruential_generator#References –