Trong C/C++, rand()
và srand()
thường được chúng ta sử dụng khi chúng ta muốn lấy một số nguyên ngẫu nhiên. Nhưng khi tôi cố tự viết lại, tôi thấy khó hiểu thuật toán. Hàm này rất dễ viết chỉ bằng một vài dòng, nhưng công thức là sự hiểu lầm.Hiểu thuật toán hàm rand() của Visual C++
Công thức chính:
ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L;
Mã gốc tham gia:
void __cdecl srand (unsigned int seed)
{
_getptd()->_holdrand = (unsigned long)seed;
}
int __cdecl rand (void)
{
_ptiddata ptd = _getptd();
return (((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
}
hmm, tôi không biết, chức năng đã có sẵn ... Tại sao thử triển khai lại? –
@Rocky, không có gì sai khi cố gắng hiểu được nền tảng của mã mà chúng tôi cho là được cấp. Trong thực tế, nó nên được khuyến khích. –
@Rocky: Thật vậy! Không bao giờ mất một cái gì đó cho các cấp nếu bạn không ít nhất có một cơ hội của một hy vọng rằng bạn có thể giải thích nguyên tắc của nó. Qi Guo: nếu bạn mệt mỏi với LCG, hãy xem Misterenne Twister, một PRNG phổ biến, nhanh chóng, chất lượng cao. –