• 締切済み

乱数について

プログラミングの授業で、各種ソートのプログラムを勉強しました。 srand (99);でランダムに数字を作っていると教わったのですが、この中の数字もランダムにしたい場合、どのようなプログラムに変えればいいのでしょうか? また、括弧内の数字で、どのようにランダムに数字をはき出しているのか知りたいです。 ~time.c~ #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX 250000 void insert_sort(int x[], int n); main() { int i , x[MAX] , n ; time_t start , end ; //列配列の選択 srand (99); for (i = 0 ; i<MAX ; i++) x[i] =rand() % MAX; n = MAX; start =clock(); //測定対象プログラム insert_sort (x ,n); end = clock(); printf("sort\n"); for(i =0 ; i < n ; i++ ) if ( i == i/100*100) printf("%d\n" , x[i]); printf ("%f sec\n" , (double)(end-start) /CLOCKS_PER_SEC); return 0; } ~insert.c~ void insert_sort(int x[], int n) { int i, j, tmp; for(i=1;i<n;i++){ for(j=i;j>0;j--){ if(x[j]<x[j-1]){ tmp = x[j]; x[j]=x[j-1]; x[j-1]=tmp; } else{ break; } } } }

みんなの回答

回答No.2

こんにちは。 さて、「本当の乱数が欲しい」とのことですが、 自分が思いついたのは次の二つの方法があります。 1.srandに入れる数値を、時と場合によって変わるものを入れる。 大抵は、時間に関係するもの ~clock()やwindowsならtimeGetTime()など ~を入れるのが多いと思います。 2.最初からそういう風に想定されている関数を使う。 win32のCryptGenRandom()などがそのような用途に使えるようです。 (システムのプロパティ値などを利用するようです。) あとBoostにハードウェアノイズを利用するものがあったような 気がしますが、思い出せません。 本題とは関係ないのですが..... 「x[i] =rand() % MAX;」 ですが、RAND_MAX == 32764 になっていると思いますので、 MAX = 250000としますと、意味がありませんね。 (MAX ≒ RAND_MAXまで降りてきても、分布に偏りがでますので 均等に分布させたかったら、(float)rand()/(float)RAND_MAX * MAX などとするのがいいと思います。)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

SRANDは乱数列のスタートを決めます。(これを乱数系列と言います。) RANDはこの系列の中から順に1個の乱数を取って行きます。 実際には前の乱数にある演算を施して次の乱数を決めています。 この演算式が乱数系列と考えてもいいわけです。 しかしこれでは困ったことが起きます。 ゲームをするたびに全く同じ乱数系列が繰り返し使われてしまうからです。 これを防ぐためにはSRANDに入れる数値をシステム時刻から持ってきたり、自分で入れさせたり、 タイマーカウントを使ったりする方法があります。