Skrivet av apan82ful:
Jag prövade båda sätten men det blir samma felmeddelande, allt fungerar som det skall ändå.
Det står: implicit conversation loses integer precision: 'time_t' (aka 'long') to 'unsigned int'
unsigned in menas väl att jag måste skapa en variabel som tillhör srand?
Problemet är att time() returnerar en long medan srand() förväntar sig en int, och på plattformen du kör så är long större än en int. Detta betyder att värdet som time() returnerar implicit kommer trunkeras, vilket kompilatorn ger en varning för. I just det här fallet spelar det ju ingen roll eftersom du bara vill ha ett värde att seeda med, men för att bli av med varningen så måste du göra konverteringen explicit:
srand(static_cast<unsigned int>(time(0)));
// Eller om du använder modern C++, använd hellre:
srand(static_cast<unsigned int>(time(nullptr)));
NULL som en del rekommenderade istället för 0 är en gammal relik från C, som för det mesta är definierad till just 0. Det kan leda till en del problem, eftersom 0 kan betyda både talet 0 eller en null-pekare. I C++11 så infördes därför nullptr istället, som endast har värdet av en null-pekare. Kompilatorn du använder bör ha stöd för C++11 om den är någorlunda modern, men ibland kan man behöva slå på det.
rand() och srand() är för övrigt också gamla C-funktioner, och rand() är oftast rätt dålig på att vara slumpmässig. I C++11 så introducerades en massa nya slumpgeneratorer i random. De fungerar genom att man använder en generator tillsammans med en distribution för att få ut slumptal som beter sig som man önskar. T.ex.:
#include <iostream>
#include <random>
int main()
{
std::default_random_engine generator; // Använd standard-generatorn, troligtvis samma som rand()
std::uniform_int_distribution<int> distribution(1, 6); // En distribution som ger slumptal mellan 1 och 6.
std::cout << "Die roll: " << distribution(generator) << std::endl;
}
Fördelen med detta är att man kan välja en generator enligt önskad slumpmässighet och prestanda, samt en distribution som ger slumptal med den fördelning man önskar. I ditt exempel med rand() % 2 så skulle man istället t.ex. kunna använda bernoulli_distribution med p = 0.5, som då returnerar true eller false med samma sannolikhet.