2013-04-28 5 views
1
rndmBid=rand() % (sellPtr->sellPrice + (1.25*sellPtr->startPrice)); 

Qu'est-ce qui ne va pas avec cette ligne? Tout est un entier sauf 1.25 (évidemment) et le compilateur donne une erreur qui dit invalid operands of types 'int' and 'double' to binary 'operator%'.Problème lors de la génération de nombres aléatoires?

J'ai essayé de changer startPrice et rndmBid doubler, sans chance. Aucune suggestion?

+1

Faites votre choix parmi les réponses ci-dessous. Nous avons presque tous tapé la même chose en même temps. Cependant, je crois que les versions statiques de fonte sont les plus correctes, le mien fait une distribution standard de c-style qui fonctionne également. –

Répondre

4

Une fois que vous introduisez une double dans une expression arithmétique, tout est promu/converti en double. Donc, vous devez reconvertir en entier:

rndmBid = rand() % static_cast<int>(...); 

(je crois que vous réalisez que vos nombres aléatoires ne seront pas distribués uniformément.)

+0

ok mais changerait-il à l'entier le plus proche? –

+0

@ user2086751: Il ne sera pas arrondi à l'entier le plus proche; il arrondira vers zéro, même s'il est plus proche d'un entier plus éloigné de zéro. – icktoofay

+0

@ user2086751: non; Si vous voulez cela, ajoutez '0.5' avant de convertir. –

2

Le rhs retourne un double, alors que % ne fonctionne que sur les entiers. Couler le résultat dans un entier:

rand() % static_cast<int>(sellPtr->sellPrice + (1.25 * sellPtr->startPrice)); 
+0

ok, mais serait-il arrondir le flottant à l'entier le plus proche? –

+1

@ user2086751 Non, il supprimera simplement la partie fractionnaire du résultat. – 0x499602D2

0

Vous ajoutez un int à un double, de sorte que le résultat est un double, qui ne peut pas être utilisé avec l'opérateur %.

Pour résoudre ce problème, vous devez faire:

rndmBid=rand() % ((int)(sellPtr->sellPrice + (1.25*sellPtr->startPrice))); 

Cela fonctionne aussi longtemps que le double n'est pas plus grand que ce qui peut tenir dans un entier.

2

(sellPtr->sellPrice + (1.25*sellPtr->startPrice) est un double car le résultat de (1.25*sellPtr->startPrice) est un double car 1.25 est un double. Cast le résultat à int et il compilera:

rndmBid=rand() % static_cast<int>(sellPtr->sellPrice + (1.25*sellPtr->startPrice)); 
Questions connexes