初期化されていないローカル変数は未定義の動作 ( UB ) であり、値にトラップ表現があり、その後の操作に影響する可能性があることはわかっていますが、視覚的な表現にのみ乱数を使用し、プログラムの他の部分ではそれ以上使用したくない場合があります。たとえば、視覚効果でランダムな色を設定する場合などです。
void updateEffect(){
for(int i=0;i<1000;i++){
int r;
int g;
int b;
star[i].setColor(r%255,g%255,b%255);
bool isVisible;
star[i].setVisible(isVisible);
}
}
それはそれよりも速いですか
void updateEffect(){
for(int i=0;i<1000;i++){
star[i].setColor(rand()%255,rand()%255,rand()%255);
star[i].setVisible(rand()%2==0?true:false);
}
}
他の乱数ジェネレータよりも高速ですか?
ベストアンサー1
他の人が指摘しているように、これは未定義の動作 (UB) です。
実際には、(おそらく)実際に(ある程度)動作します。x86[-64]アーキテクチャで初期化されていないレジスタから読み取ると、確かにガベージ結果が生成されますが、おそらく何も悪いことは起こりません(Itaniumなどとは異なり、レジスタは無効としてフラグが付けられる可能性がある、読み取りは NaN のようなエラーを伝播します。
しかし、主な問題が 2 つあります。
特にランダムというわけではありません。この場合、スタックから読み取るので、以前そこにあったものを取得します。それは実質的にランダムな場合もあれば、完全に構造化された場合もあり、10 分前に入力したパスワードやおばあちゃんのクッキーのレシピなどです。
このようなことをコードに忍び込ませるのは悪い習慣です。技術的には、コンパイラは
reformat_hdd();
未定義の変数を読み取るたびに挿入することができます。そうはなりませんが、とにかくそうすべきではありません。安全でないことはしないでください。例外を少なくすればするほど、常に偶発的なミスからより安全になります。
UBのより深刻な問題は、プログラム全体の動作が未定義になることです。現代のコンパイラはこれを利用して、コードの大部分を省略したり、時間内に戻るUB で遊ぶのは、稼働中の原子炉を解体するビクトリア朝のエンジニアのようなものです。失敗する可能性は無数にあり、おそらく基礎となる原理や実装された技術の半分も知らないでしょう。大丈夫かもしれませんが、それでも起こさないようにしてください。詳細については、他の優れた回答を参照してください。
また、私はあなたを解雇します。