2012-03-23 129 views
2

下面的代碼生成N整數隨機數的數組,並將結果存儲在random_int_array如何獲得隨機數的數組中的Fortran

N=20 
allocate(array(N/2)) 
call random_seed 
call random_number(array) 
random_int_array=int(array*N) 

的問題是,我可能會在random_int_array和我不產生重複我不想那樣。我怎樣才能從這個數組中刪除重複,或者相當於如何生成一組唯一的隨機數?

注意array具有尺寸N/2。所以,問題基本上是抽取N/2號,沒有重複,出N.

+0

而最簡單可行的方法,在這裏你直接跳過重複,是不是不夠好? (從random_int_array1移動項目的random_int_array2如果他們不已經是第二陣列中) – 2012-03-26 15:57:42

+0

就足夠了,但我需要一個聰明的方式找到重複和擺脫他們。 – Brian 2012-03-28 07:59:12

+0

沒關係,我找到了這個網頁真的是我的問題非常有用:http://rosettacode.org/wiki/Remove_duplicate_elements#Fortran – Brian 2012-03-28 08:09:20

回答

3

這聽起來像你想從1到19按隨機順序的整數。這將是這些整數的洗牌。見例如http://tekpool.wordpress.com/2006/10/06/shuffling-shuffle-a-deck-of-cards-knuth-shuffle/http://en.wikipedia.org/wiki/Fisher-Yates_shuffle

+0

這不是我要找的。我編輯的帖子現在應該更清楚了。 – Brian 2012-03-23 16:05:01

+2

但是你可以洗牌N個數字,並將其中的一半放入陣列。 – 2012-03-23 16:34:42

+3

或者只是運行洗牌的一半。 – 2012-03-23 16:47:00

0

所以你試圖從一組大小20中產生10個可能的組合中的一個?有184756個這樣的組合。你可以生成在範圍[1..184756]單個隨機整數和使用,作爲輸入到函數來創建n個組合。

後一個問題是在SO定期上升,例如Calculate Combination based on position包含的溶液中。

我並沒有聲稱這種做法是不是在正確的範圍內反覆產生隨機數和丟棄重複,直到你有一組滿足您的要求,任何一般的方式更好。

0

定義下列功能的主程序之外

function random_uniform(m) 
    implicit none 
    integer*8 m 
    real*8 random_uniform 
    m = mod(7**5*m, 2147483647) 
    random_uniform = m/2147483647.  
end function 

然後在主函數中,使用此功能來生成隨機數組:

m = 1067 !This is your seed which you can change to get different sequence 
do i = 1,20 
    array(i) = random_uniform(m) 
enddo 

注意,所有的整數是雙精度型(* 8)。這是必須使這個功能正常工作。此外,爲避免整數除法得到random_uniform,我們已經轉換爲分母實(從整數* 8)

+0

你能描述它的功能嗎?它如何保證不重複的值?它比'random_number'好嗎?注意OP需要隨機*整數*數組。 – 2014-06-28 19:08:10

+0

的確,@VladimirF。雖然'M'會(一般)長週期,這並不回答這個問題無random_uniform'是如何'映射到整數仔細描述。 – francescalus 2014-06-28 19:43:37

+0

正如你必須指出的那樣,這是一個線性同餘發生器。它由Lewis,Goodman和Miller於1969年提出併成功通過了許多測試(雖然有更好的發生器可用)。請注意,該發生器的週期爲2147483647,這對任何實際用途都很有用。一旦我們有這個功能,獲取整數數組而不是實數編號的數組就是小孩的遊戲。 – Peaceful 2014-06-30 05:46:23