1

重複の可能性:
rand() を呼び出して非ランダムな結果を返す

私のワークショップでは、2 つの異なる乱数を取得する必要がありますが、2 つの同じ乱数を取得します。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int random1_6(){
 int k;
 srand(time(0));
 k=((rand()%6)+1);
 return k;
}
int main(void){
 int a,b;
    a=random1_6();
    printf("%d.\n",a);
    b=random1_6();
    printf("%d.\n",b);
return 0;
}

2つの異なる乱数を取得するには?

4

4 に答える 4

5

非暗号乱数ジェネレーター (RNG) は真のランダムではありませんが、シードに基づいて乱数に似た数値を生成します。

あなたがしていることは、同じシードで RNG を 2 回初期化しているため、同じ結果が得られます。プログラムの開始時などに RNG を 1 回だけシードすると、ランダムのような異なる結果が得られます。

編集:次のようなコードが機能するはずです:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int random1_6(){
  return ((rand() % 6) + 1);
}

int main(void){
  int a,b;
  srand(time(NULL));

  a = random1_6();
  printf("%d.\n",a);

  b=random1_6();
  printf("%d.\n",b);

  return 0;
}
于 2012-07-08T14:18:54.543 に答える
3

srand(time(0));すべての呼び出しで実行しないでください。一度だけ呼び出します。

于 2012-07-08T14:18:14.733 に答える
1

乱数ジェネレーターのシードを1srand()だけ初期化する必要があります。呼び出しごとに、同じシードで RNG を再初期化します。これは、2 つの後続の呼び出しが同じタイムスタンプ (秒レベルの精度) を返す可能性が最も高いためです。 rand() は同じ数値を 2 回返します。time(0)

srand()プログラムの最初 (エントリポイント) で 1 回だけ呼び出すmain()と、rand() を呼び出すたびに異なる数値が返されます。

于 2012-07-08T14:18:18.167 に答える
0

常に同じシードで乱数ジェネレーターを初期化するため、同じ乱数シーケンスが得られます。とにかく疑似乱数です。通常、ジェネレーターを初期化するために最初に 1 回だけ srand を呼び出します。

また、可能な結果は 6 つしかないため、同じ数字を 2 回取得することは完全に正当であり、その可能性は 1/6 です。

于 2012-07-08T14:20:37.650 に答える