2015-04-21 16 views
5

Bu C yasaldır ++ yazmak için?std :: time std :: srand geçerli kodu ile kullanılıyor mu?</p> <pre><code>std::srand(std::time(nullptr)); </code></pre> <p>veya bu verim tanımlanmamış davranışı yapar:


std::time bir aritmetik tip olan bir std::time_t verir, ancak bu belirtilmemiş dışında. Anlayışımdan, aritmetik tip, kayan nokta, tam sayı ve karakter türlerinden biridir.

std::srand bir tohum değeri olarak bir unsigned int alır.

Bu nedenle, sana kesinlikle bu dönüşümü gerçekleştirmek olamayacağını düşünürdüm. POSIX uyumlu sistemlerde std::time_t'un integral olduğunu ve 00:00, 1 Ocak 1970 UTC'den bu yana geçen saniye sayısını okudum. Bu durumda, dönüştürme imzalı işaretsizden dönüştürmeyi gerektirebilir; bu, uygulama tarafından tanımlanan bir dönüşümdür, ancak Tamam olmalıdır ve daha büyük bir integralden, tohum için de iyi olan daha küçük bir tümleşik türden.

+0

Aritmetik tür, standart dönüştürme kurallarından bir veya daha fazlasını kullanarak bir "işaretsiz int" dönüştürülebilir. –

+0

"Rand" nin yeni 'üstbilgisi lehine kullanımdan kaldırılma sürecinde olduğunu düşünürsek, bu konudaki herhangi bir uykuyu kaybetmem. –

cevap

4

Doğru, time_t bir kayan nokta türü olabilir ve kesilme sonucu değeri unsigned int olarak gösterilemiyorsa, davranış tanımsızdır ([conv.fpint]/1).

standart bir-uyumlu bir şekilde rastgele sayılar oluşturmak istiyorsanız

, ben C++ 11 <random> imkanları düşündürmektedir. RNG'leri std::random_device'dan tohumlayabilirsiniz. Bkz. , ör. https://stackoverflow.com/a/19666713/481267