Я пытаюсь заполнить вектор измерения "N" возможными разными числами "q", но я хочу иметь возможность ставить одни числа с большей вероятностью, чем другие. Мой код:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>
/*to get a nonzero PRN using overflow*/
int random(int seed){
int a=1664525;
seed *= a;
if(seed<0){
seed=seed+2147483647+1;
}
return (seed);
}
/*get a seed and ajust that number in to a interval between 0--> q-1*/
int choose(int seed, int n){
float fState;
int state;
fState=(((float)seed/2147483647.0)*n);
state=fState;
return state;
}
/*the filling function*/
void weight2(int q, int theqs, float prob[],int rvector[], int *seed, int N){
float help;
int aq=q-theqs;
for(int i=0;i<N;i++){
*seed=random(*seed);
help=(float)*seed/2147483647.0;
if(help<prob[0]){
rvector[i]=aq;
}
else if(help<prob[0]+prob[1]){
rvector[i]=aq+1;
}
else if(help<prob[0]+prob[1]+prob[2]){
rvector[i]=aq+2;
}
else{
*seed=random(*seed);
rvector[i]=choose(*seed,aq);
}
}
}
int main(){
int seed=5364789;
int q=3;//posible states
int N=10;//size of the vector
int rvector[N];
int theqs=0;
float prob[]={0.5,0.0,0.0};
for(int i=0;i<3;i++){
if(prob[i]>0.0){
theqs++;
}
}
weight2(q,theqs,prob,rvector,&seed,N);
for(int k=0;k<N;k++){
printf("%i ,",rvector[k]);
}
printf("\n");
return 0;
}
компиляция этой программы дает следующий вектор:
2 ,2 ,0 ,-1 ,2 ,1 ,2 ,0 ,-1 ,-1 ,
Я не должен получать отрицательное число в моем векторе, поэтому я пытаюсь напечатать вероятности, которые я получаю:
void weight2(int q, int theqs, float prob[],int rvector[], int *seed, int N){
float help;
int aq=q-theqs;
for(int i=0;i<N;i++){
*seed=random(*seed);
help=(float)*seed/2147483647.0;
printf("The prob was:%f, to the space: %i\n",help, i);//i add this comment
if(help<prob[0]){
rvector[i]=aq;
}
else if(help<prob[0]+prob[1]){
rvector[i]=aq+1;
}
else if(help<prob[0]+prob[1]+prob[2]){
rvector[i]=aq+2;
}
else{
*seed=random(*seed);
rvector[i]=choose(*seed,aq);
}
}
}
и я запускаю программу с этой новой строкой и получаю следующий результат:
The prob was:0.273996, to the space: 0
The prob was:0.123212, to the space: 1
The prob was:0.815315, to the space: 2
The prob was:0.697087, to the space: 3
The prob was:0.458718, to the space: 4
The prob was:0.663403, to the space: 5
The prob was:0.092523, to the space: 6
The prob was:0.734523, to the space: 7
The prob was:0.845949, to the space: 8
The prob was:0.916535, to the space: 9
2 ,2 ,1 ,0 ,2 ,1 ,2 ,1 ,0 ,0 ,
что и было моей программой.
Я неправильно использую переменную, чтобы моя программа работала таким образом? Почему оператор print заставляет программу работать так, как задумано?