我有一个三个相同球的袋子。我制作了代码来模拟每个球脱落的次数(到目前为止它完美无瑕)。
#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%)?
答案 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%的白色。