-2

我有一袋三个相等的球。我编写了代码来模拟每个球脱落的次数(到目前为止它工作得很好)。

代码

#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;
}

但是现在我正在做的研究需要三个球;一个球是蓝色的,两个球是白色的。

我必须改变什么rand(),所以它会吐出三分之二的蓝球(~33%)和三分之二的白球(~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

一种解决方法是:

  • 想象一下有一个袋子,里面有 10 个球,3 个红色,3 个蓝色,3 个绿色和 1 个白色。

  • 获取一个数组[10]。

  • 用“红色”填充 [0][1][2],用“蓝色”填充 [3][4][5],用“绿色”填充 [6][7][8],用“绿色”填充 [9]。

  • 调用 rand()%10 =数组索引

  • 您将获得大约 30% 的红色、30% 的蓝色、30% 的绿色和 10% 的白色。

于 2013-06-13T14:17:39.670 回答