如何使用GMP在一定范围内生成随机数

时间:2013-04-02 22:38:20

标签: c++ random gmp

我试过这样做:

int main(){
  mpz_t v;
  mpf_class u,w,x[3][200];     

  for(i=0;i<n;i++){
   for(j=0;j<3;j++){
     mpz_random(v,1000000);
     mpf_div_ui(w.get_mpf_t(),v,1000000);
     mpf_div(u.get_mpf_t(),1,2);
     mpf_sub(w.get_mpf_t(),w.get_mpf_t(),u);
     mpf_mul(x[i][j].get_mpf_t(),w.get_mpf_t(),2);
   }
  }
}

但是使用整数和浮点数不起作用。基本上尝试分配随机整数,除以最大值整数可以给出0到1之间的数字(不一定是整数)。减半并乘以2给出-1到1之间的随机数,这是我想要的,但是就像我说的那样,这会导致类型问题。

1 个答案:

答案 0 :(得分:2)

如果我正确理解你的程序的意图,这应该或多或少是你所追求的。

int main(){
  gmp_randstate_t state;
  mpf_class v, w, x[3][200];

  gmp_randinit_mt(state);
  for(int i=0;i<3;i++){
   for(int j=0;j<200;j++){
     mpf_urandomb(v.get_mpf_t(), state, 4);
     mpf_urandomb(w.get_mpf_t(), state, 256);
     if (v < .5) w *= -1;
     x[i][j] = w;
   }
  }
}

state变量用于通知随机数例程您希望用于随机数生成器的算法。在上面的代码中,我已经初始化它以使用Mersenne Twister算法。

您没有正确声明ij索引。

mpf_urandomb()的第一次调用得到0到1之间的4位随机值。它用于判断下一个数字是否应为负数。

mpf_urandomb()的第二次调用获得介于0和1之间的256位随机值。如果前一个数字小于.5,则该值被否定。

此值已分配给x[i][j]