我尝试过如下操作:
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 算法。
您没有正确声明您的 i
和 j
索引。
第一次调用 mpf_urandomb()
得到一个介于 0 和 1 之间的 4 位随机值。它用于决定下一个数字是否应该为负数。
第二次调用 mpf_urandomb()
得到一个介于 0 和 1 之间的 256 位随机值。如果之前的数字小于 .5
,则该值取反.
这个值赋给了x[i][j]
。
关于c++ - 如何使用GMP生成一定范围内的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15775679/