Печать переменной заставляет функцию работать по-другому - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь заполнить вектор измерения "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 заставляет программу работать так, как задумано?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...