如何根据概率定义rand()?

时间:2013-05-10 16:44:37

标签: c random posix probability ansi

我有一个三个相同球的袋子。我制作了代码来模拟每个球脱落的次数(到目前为止它完美无瑕)。

代码

#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%)?

3 个答案:

答案 0 :(得分:2)

int x = rand() % 3;

x将选择0到2之间的“随机”数字

如果x <= 1则为白色(66%) 如果x == 2则为蓝色(33%)

答案 1 :(得分:1)

制作自己的功能

#define BLUE 1
#define WHITE 2

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

这将在33%的时间内返回蓝色,在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
}

答案 2 :(得分:0)

一个解决方法是:

  • 想象一下,这个包有10个球,3个红色,3个蓝色,3个绿色和1个白色。

  • 获取数组[10]。

  • 用&#39; red&#39;,[3] [4] [5]填充[0] [1] [2]&#39; blue&#39;,[6] [7 ] [8]用&#39; green&#39;和[9]&#39;白色&#39;

  • 调用数组的rand()%10 = index

  • 你会得到约30%的红色,30%的蓝色,30%的绿色和10%的白色。