2013-04-02 51 views
1

我試圖做到這一點,如下所示產生一定範圍內的隨機數:如何使用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之間的隨機數,這是我想要的,但是就像我說的那樣由於類型導致問題。

+0

你在說什麼「因類型引起的問題」?你可能要考慮使用'mpf_urandomb()'。這可能是簡單的2先乘,然後減去1 – jxh

+0

@ user315052對不起我的意思是,我得到的錯誤說「無效的轉換從int爲const ......」意思是由於v爲整數,它可以」 t用於mpf函數。 – adrem7

+0

@ user315052我看過mpf_urandomb()函數,它看起來像我想要的,除非我不知道「狀態」是什麼意思,有人可以解釋一下。 – adrem7

回答

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]

+0

你爲什麼選擇我可能要求的精度? – adrem7

+0

只需做出否定或否定的決定就不需要很高的精度。我剛剛製作的大精度。使用任何有意義的東西給你。 – jxh