+1 oder -1 zufällig wählen
-
Einfach so:
rand()%2? 1 : -1Wir sind hier schließlich nicht beim obfuscated code contest.
-
Das ternäre if ist doch einer der Grundpfeiler des IOCCC.

-
Hier noch eine Möglichkeit:
"\xFF\x01"[rand()%2]
-
ioccc schrieb:
Hier noch eine Möglichkeit:
"\xFF\x01"[rand()%2]Und dann mit
-fsigned-charkompilieren?
-
Zugegeben,
std::array<int,2>{-1,1}[rand()%2]ist standardkonformer (da es weder von der Signedness, noch der 8-Bittigkeit und Overfloweigenschaft von char abhängt).
-
Und Indices in Arrays zu generieren ist auch imo der beste Weg um komplexere Zahlenverteilungen zu erhalten.
-
Falls
%2auf der Plattform zu langsam oder nicht verfügbar ist, kann man auch diese Lösung verwenden:for (;;) { int r = -23 + std::rand(); if (std::labs(r) == 1) { return r; } }Wenn die Zufallszahl sich nicht so oft ändern muss, geht auch das:
std::ptrdiff_t randomness = reinterpret_cast<std::intptr_t>(&std::rand); return (randomness < 0) ? -1 : 1;Oder der Klassiker für maximale Effizienz:
int uninitialized; return (uninitialized < 0) ? -1 : 1;
-
Warum du
labsverwendest (und nichtabs) ist mir schleierhaft. Und warumptrdiff_tfürrandomness?Oder der Klassiker für maximale Effizienz:
UB. Außerdem nicht zufällig wenn die Stackframes sich überschneiden.
Ich befürchte eine Deface-Attacke auf TyRoXx Account, daher fühle ich mich verpflichtet moderationstechnische Maßnahmen zu ergreifen und Account bis auf weiteres zu sperren.

-
Vielen Dank euch Allen, hat mir sehr geholfen!
-
Arcoth schrieb:
Und warum
ptrdiff_tfürrandomness?Oh, ich habe das mal korrigiert:
std::intptr_t randomness = reinterpret_cast<std::ptrdiff_t>(&std::rand); return (randomness < 0) ? -1 : 1;Arcoth schrieb:
Oder der Klassiker für maximale Effizienz:
UB. Außerdem nicht zufällig wenn die Stackframes sich überschneiden.
Kein Problem, einfach mit
-O0übersetzen.