Je tente de convertir une fonction pseudo rand de C++ en C# mais cela ne semble pas retourner les valeurs correctes. Il est important que j'utilise un ensemble cohérent pour le cryptage, donc je ne peux pas utiliser un nombre aléatoire.Pseudo aléatoire incohérent entre C++ et C#
c'est la fonction en C++.
int get_pseudo_rand()
{
return(((_last_rand = _last_rand * 214013L
+ 2531011L) >> 16) & 0x7fff);
}
et ceci est mon C# autre
int get_pseudo_rand()
{
return (((_last_rand = (_last_rand * 214013 + 2531011) >> 16) & 0x7fff));
}
j'ai enlevé les Ls depuis C# de type de données int est de 4 octets comme C++ désire ardemment alors que c les positions longues N ° sont 8 octets.
la première fois que la fonction est exécutée à partir de la graine, la réponse est cohérente avec la version C++, mais commence alors à diverger.
Des idées?
Le code C++ manque une parenthèse quelque part. Aussi, pouvez-vous préciser quel type '_last_rand' est dans chaque langue. (Et pour C++, la taille de ce type sur votre paltform.) Aussi, si possible, la graine que vous utilisez et les deux premiers nombres aléatoires sur chaque plate-forme. –
Certainement, La graine est 1274653591 et son correctement réglé les deux fois. Dans le code C++, les deux premières réponses sont 28818 et 20295. Elles sont correctes. En C#, les deux premiers résultats sont 28818 et 28610. _last_rand est un int (4 octets) dans les deux langues. J'utilise un programme 32 bits donc la taille des entiers et des longs dans C++ devrait être de 4 octets. (La parenthèse manquante est sans conséquence pour le calcul) – Steve
Vous savez, si vous utilisez des variables temporaires, cela rendrait votre intention plus claire, et rendrait cela moins sujet aux erreurs que vous avez trouvées ici. Aussi, un bon compilateur (gigue) * devrait * l'optimiser de toute façon. –