J'essaye de produire un flottant aléatoire dans la gamme -50.0 et 50.0 inclusivement, en utilisant rand(). J'ai cherché partout une réponse, mais il s'agit d'ints et de% operator.Produire un flottement aléatoire de la plage négative à la plage positive?
Répondre
Essayez ceci:
float RandomNumber(float Min, float Max)
{
return ((float(rand())/float(RAND_MAX)) * (Max - Min)) + Min;
}
Essayez ceci:
rand()
vous donne un nombre compris entre 0 etRAND_MAX
- donc diviser par
RAND_MAX
pour obtenir un nombre compris entre 0 et 1 - vous désirez une gamme de 100 de -50 à 50, alors multipliez par 100.0
- finalement décaler le centre de 50 (entre 0 et 100 par le point 3) à zéro en soustrayant 50.0
((float)rand())/RAND_MAX * 100.0 - 50.0
Honnêtement, toutes les réponses actuelles n'expliquent pas qu'il y ait un changement dans la distribution de leurs solutions (je suppose que rand() suit la distribution uniforme! corrigez-moi si je me trompe s'il vous plaît). Utilisez une bibliothèque s'il vous plaît, et ma recommandation utilise les nouvelles installations en C++ 0x:
#include <random>
#include <functional>
int main()
{
std::mt19937 generator;
std::uniform_real_distribution<float> uniform_distribution(-50.0, 50.0);
auto my_rand = std::bind(uniform_distribution, generator);
}
Si vous ne pouvez pas, Boost est un choix parfait. De cette façon, vous pouvez utiliser my_rand() tout comme le bon vieux rand():
std::vector<float> random_numbers(1000);
std::generate(random_numbers.begin(), random_numbers.end(), my_rand);
La question dit qu'il doit utiliser 'rand' spécifiquement. Mais oui, je suis d'accord; Si la distribution est vraiment importante, le boost semble être une bonne option. – Maxpm
@Max: Plus précisément, la question dit "essayer ... en utilisant rand()"; l'OP n'a jamais dit que c'était une * exigence *. – Cascabel
@Jefromi Bon point. Je dois être plus privé de sommeil que d'habitude. : P – Maxpm
double possible de [float aléatoire C de] (http://stackoverflow.com/questions/686353/c-random-float –