-2

私は3つの等しいボールが入ったバッグを1つ持っています。各ボールが外れる回数をシミュレートするコードを作成しました (これまでのところ問題なく動作しています)。

コード

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <string.h>

#define N 50 /* Number of simulations*/
#define P 3  /* Number of of balls*/

unsigned long long millitime2(){
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (unsigned long long)(tv.tv_usec);
}

int main() {
    int i;
    int num = 0;
    int *v;
    if((v = malloc(N*sizeof(int))) == NULL){
        printf("\n\tMEMORY ERROR");
        exit(1);
    }
    memset(v,0,N);
    printf("\nexpected freq: %f\n\n", ((float)1/(float)P)*100);

    for (i=0; i<N; i++){
        srand(millitime2());
        num = (rand()%P);
        v[num]++;
    }
    for(i=0;i<P;i++){
        printf("ball:%d   picked:%d/%d   freq:%f\n",i+1,v[i],N,((float)v[i]/(float)N)*100);
    }
    printf("\n");
    return 0;
}

しかし今、私が行っている研究では、3 つのボールからそれが必要です。1 つのボールは青で、2 つのボールは白です。

の行で何を変更する必要があるrand()ので、3 回に 1 回 (~33%) 青いボールを吐き、3 回に 2 回 (~66%) 白いボールを吐きますか?

4

3 に答える 3

2
int x = rand() % 3;

x は 0 から 2 の間の「乱数」を選択します

x <= 1 の場合は白 ( 66%) x == 2 の場合は青 ( 33%)

于 2013-05-10T16:49:37.883 に答える
1

独自の関数を作成する

#define BLUE 1
#define WHITE 2

int whichBall()
{
  int val = rand() % P;
  if (val == 0)
    return BLUE;
  return WHITE;
}

これにより、BLUE が 33% の確率で返され、WHITE が 66% の確率で返されます。

10 個のボールの場合、青 3 個、白 3 個、黒 4 個の場合:

#define BLUE = 3
#define WHITE = 3
#define BLACK = 4

int whichBall()
{
  int val = rand() % P;
  if (val < BLUE)
    return BLUE;
  if (val < BLUE + WHITE)
    return WHITE;
  if (val < BLUE + WHITE + BLACK)
    return BLACK
  return BLACK;//This line should never be reached but is included so it compiles
}
于 2013-05-10T16:48:04.683 に答える
0

これに対する 1 つの回避策は次のとおりです。

  • 赤 3 個、青 3 個、緑 3 個、白 1 個の 10 個のボールが入ったバッグがあると想像してください。

  • 配列を取得します[10]。

  • [0][1][2] を「赤」、[3][4][5] を「青」、[6][7][8] を「緑」、[9] を「白」で塗りつぶします。

  • rand()%10 を呼び出す =配列のインデックス。

  • 赤が約 30%、青が 30%、緑が 30%、白が 10% になります。

于 2013-06-13T14:17:39.670 に答える