0

私は次のプログラムを持っています:

srand((unsigned) time(NULL));
for (int w = 0; w < 10; w++) {
    int ran_x;
    ran_x = rand() % 255;
    cout << "nRandom X = " << ran_x << endl;
    //some more lines of code
    Sleep(1000);
}

Visual C++ 2008 で実行しています。このプログラムを実行しても、エラーや警告は表示されません。しかし、実行すると、正常に実行される場合もあれば、途中で停止して「このアプリケーションはランタイムに通常とは異なる方法で終了するように要求しています。アプリケーションのサポート チームに連絡してください」というエラーが表示される場合もあります。詳しくは。"

何をすればよいでしょうか?Sleep() 関数を使用せずにそれを実行しても、ランダムに生成された値を取得することは可能ですか? Sleep(1000)を削除すると、エラーは発生しませんが、ランダムな値も返されないためです

4

5 に答える 5

4

もちろん寝てはいけません。srand() を 1 回だけ呼び出す限り、コードは正気のように見えます。このコード ブロック全体を 1 秒以内に複数回呼び出すと、time(NULL) は同じ秒の値を返し、srand() は同じ数値で疑似乱数の生成を開始し、その後同じ 10 のセットを選択します。数字....

于 2011-02-08T08:20:06.570 に答える
1

あなたのプログラムは、スリープコールなしで完全に動作するはずです。実際、VS2008で完全に機能しているようです。あなたの問題は、無関係だと思って削除したコードにあるに違いないと思います。

于 2011-02-08T08:21:53.673 に答える
1

gccで問題なく動作

#include <iostream>
#include <cstdlib>

int main (int argc, char *argv[])
{    
    srand( time(0) );

    for (int w = 0; w < 10; w++)
    {
        int ran_x = rand() % 255;

        std::cout<<"\nRandom X = " << ran_x << std::endl;

        sleep(1);
    }

    return 0;
}
于 2011-02-08T08:17:44.793 に答える
1

投稿したコード スニペットは、アプリケーションの終了にほとんど責任を負いSleepません。

Sleep(1000) を削除すると、エラーは発生しませんが、ランダムな値も返されないためです。

確かrand()に疑似乱数が得られますが、PRNG の実装では、返される値のビットに沿って均等に分散されたランダムな値が返されない場合があります。つまり、多くの実装では、上位のビットが下位のビットよりも頻繁に変化します。 code は、0 から 255 の間のランダムな値を選択するのに適していません。

一般に、標準ライブラリの rand/srand から、boost のメルセンヌ ツイスター ( boost::random ) のような実装に切り替えることをお勧めします。または、少なくとも

http://c-faq.com/lib/randrange.html

于 2011-02-08T08:25:41.900 に答える
0

「さらに数行のコード」の内容は何ですか?

<サイキックデバッグ>あなたは、直接的または間接的に、以前に生成したランダムな値に依存するコードを持っているに違いありません。このコードは除算であるか、コンテナの長さの設定を伴う可能性があり、生成された乱数が0の場合は中断します。</ psychicdebugging>

于 2011-02-08T10:50:24.707 に答える