c++ - 如何使用GMP生成一定范围内的随机数

标签 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);
   }
  }
}

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

最佳答案

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

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]

关于c++ - 如何使用GMP生成一定范围内的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15775679/

相关文章:

c++ - 在 Qt 5.3 中向工具栏添加图标

c++ - 带指针的 Getter 和 Setter

python - 如何在不使用 if 语句的情况下随机调用三个函数之一?

C++ 随机数生成器 : How to make numbers random upon every execution

php - 使用 bc_math 或 GMP 计算根

c++ - 调试 MFC : "mfc100.dll" cannot find or open pdb

python - 从函数列表中获取随机函数并调用所选函数

c - GMP pow 中的溢出处理

c++ - 对我构建的类使用 STL sort() func

c++ - 从自定义类到内置类型的转换