コメントにしようかとも思ったのですが、量がそこそこになりそうなので回答で。
ループの仕様の問題ではありません。srandとrandの意味/使い方を理解していないことが問題です。
完璧な(前後の値と全く無縁な)乱数というのは事実上無理なので、コンピュータ上では直前の値から計算によって乱数っぽい値(疑似乱数)を算出しています。一般的には「線形合同法」が使われることが多いです。興味があれば調べてみてください。
そして、「直前の値」になにか(プログラマが管理する)数を与えるのがsrand()関数です。これを乱数の「種」とよくいいますが。(プログラムの検証などでは、同じ乱数列をなんども試してみたい、というケースはよくあるので乱数並びを再現できることも必要です)
また、time()関数は、現在の時刻を秒単位で返す関数です。
さて。
C
1 while(1){
2 srand((unsigned)time(NULL));
3 n = rand() % 10+1;
4 printf("%d\n", n);
5 }
時刻が1579820801だったとしましょう。
また、rand()関数が直前の乱数に123を掛けて45を足したものを次の(疑似)乱数として返すものだったとしてみましょう。
このプログラムは、現在の時刻1579820801を得て、それを「種」に設定します。
rand関数で、1579820801に123を掛けて45を足すと、unsigned intの範囲では1044430248になります。10で割ったあまりは8で、それに1を足して9がnに入り、それが表示されます。
この操作は「一瞬」ですね。なのでループの繰り返しでは次回も時刻は1579820801が得られるでしょう。そうすると、これを「種」に設定して123を掛けて45を足して10で割った余りに1を足して9。これも一瞬なのでまた次の時刻は1579320801。
一瞬とはいえいくらかの時間はかかりますから、9がだ~っと表示された後、時刻が1579820802になる時が来ます。123を掛けて45を足すとunsigned intの範囲では1044430371。10で割ったあまりに1を足すと2。しかしこれも一瞬なのでまた2がだ~っと表示されることになります。
この繰り返しが、あなたのプログラムに起こった現象です。
srand()がループの外に出ていれば
C
1 srand((unsigned)time(NULL));
2 while(1){
3 n = rand() % 10+1;
4 printf("%d\n", n);
5 }
時刻1579820801を得て、
rand()は1044430248を返します。9を表示したあと、
その次のrand()では1044430248に123を掛けて45を足してunsigned intの範囲にした3910868965を返します。すると表示されるのは6。
その次のrand()では3910868965に123を掛けて45を足してunsigned intの範囲にした545588が得られて9を表示
...
という動作になるので、これは期待したものでしょう。
別件ですが。
既に経験されているとは思いますが、プログラムでは一文字の間違いでもエラーになって実行出来なかったり、実行できても期待しない結果が得られることがあります。その意味で、質問で提示するプログラムは、厳密にあなたが使ったのと同じものでないと、あなたの疑問の解決に何の役にも立たない場合が考えられるのはおわかりですね? (もちろん、問題になっている点以外を削ぎ落としてもいいですけれど、何が問題かわからなければ削ぎ落としも出来ないはずです)
そのプログラム、明らかに間違っています。一箇所が間違っているなら、他も間違っているんじゃないか、というのは十分考えられるでしょう。と、回答しようと思った私はなにを拠り所に問題点を考えればいいのでしょうか...
解決したいのなら、質問をしっかりとしてください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。