たびたびすいません.
srand(10);
int k,x,y;
for(k=0;k<500;k++)
{
x=(rx*rand()/RAND_MAX/10)*10;
y=(ry*rand()/RAND_MAX/10)*10;
dc.Rectangle(x-0,y-0,x+10,y+10);
}
dc.SelectObject(pPrevBrush);
というプログラムなのですが、乱数がかぶってしまいます.
もっとランダムにしたいのですが、どなたか教えていただけませんか.
int n = 100; などとしておけば、
x = rand() % n; で、x には 0 ~ n-1 が代入されます。
どんな乱数が必要なんですか?
範囲は?
整数?小数?
> 乱数がかぶってしまいます.
とは、500回繰り返しているうちに同じ数が出てしまったという事でしょうか?
もしそうでしたら、一度使用した数を2度使わないように自分で処理する必要があります。
> 乱数がかぶってしまいます
VC++のヘルプより
void main( void )
{
int i;
/* 実行するたびに違う値が得られるように、現在の時刻値を使って
* 乱数ジェネレータを初期化します。
*/
srand( (unsigned)time( NULL ) );
/* 10 個の値を表示します。 */
for( i = 0; i < 10;i++ )
printf( %6d\n, rand() );
}
> /* 実行するたびに違う値が得られるように、現在の時刻値を使って
> * 乱数ジェネレータを初期化します。
> */
あ、そのセンも考えられますね。
どちらのケースの事なんでしょう?
rand()は擬似乱数を返す関数なので
かぶることはないと思いますが、
toraさんの場合、下1桁を切り捨てているため、
例えば
201->200
206->200
となり、かぶっている状態になるのでしょう。
だから、下一桁を切り捨てるのではなく....
ついこの前、全く同じ状況で悩みました
結局、ボコノン教徒さんの指摘されているように
srand( (unsigned)time( NULL ) );
for(i=1;i<=ryusisu;i++){
x[i] = 50 * (double)rand()/RAND_MAX;
y[i] = 50 * (double)rand()/RAND_MAX;
}
と
初期設定をすることで、解決しました
後は、このルーチンを繰り返し呼び出すだけです
乱数に少し偏りはありますが、同じ系列を繰り返すことはなくなりました