2011-10-01 51 views
3

有沒有更好的算法可以做到以下幾點?隨機生成一個可被N整除的數字的最佳算法

我試圖產生50個可以被7整除的隨機數。然後我選擇其中的50個隨機&返回那個數。

是否有更高效/更好的方法來隨機生成可被7整除的數字?有沒有更好的方法可以編碼/做到這一點?

unsigned int generateRandomNumberDivisibleByN(unsigned int n, unsigned int num=10) 
    { 
     // Post: Generate many different random numbers that are divisible by n, then randomly select one of 
     //  of those numbers to return. 

     unsigned int potentialNums[num]; 

     for (int i=0, j=2; i<num; i++, j=rand()%INT_MAX) 
     { 
      potentialNums[i] = j*n; 
     } 

     return potentialNums[ rand()%num ]; // should this be rand()%(num-1) so it never returns an invalid array index? 
    } 
+5

是否真的有益處經過短短'蘭特()* N'?生成一個隨機數字的數組,然後隨機選擇一個真的會改善什麼? – cnicutar

+2

我知道生成一個可以被7整除的隨機數的最簡單方法是'7 * rand()'。如果你有更多的具體需求,你需要明確說明需求...... –

+2

你應該小心溢出:當'j> INT_MAX/7'時,'7 * j'會溢出。 –

回答

13

乘它爲什麼不你只是做可以嗎?

return (rand() % MAX) * 7; 

它做幾乎相同的事情。

哪裏MAX足夠小,通過7,以避免乘法期間溢出,你可以定義爲:

const MAX = INT_MAX/7; 

或者,如果你希望它是快,你可以這樣做:

return (rand() & 0xff) * 7; 
+1

%或&操作會使分佈偏斜,但如果RAND_MAX是2的冪,則'&0xFF'不應傾斜。 – harold

+0

@harold:我認爲'RAND_MAX'保證是2的冪。 –

+0

@MooingDuck我能找到的唯一保證是它必須至少32767 – harold

5

最有效的方法隨機生成一個號碼由7整除是生成一個隨機數,然後通過7

return (rand() % (INT_MAX/7)) * 7 
+0

那裏的%操作會歪曲分配。爲什麼不把它除以7再乘以7呢?這也傾斜,但它更短。 – harold

0

爲什麼會產生一堆隨機數,然後隨機選擇其中一個呢?您已經有了核心思想:生成一個隨機數並將其乘以7. potentialNums數組不會添加任何值。

0

爲了使這個快得多第一次使用的快速隨機生成功能found here這應該更快創建隨機量的實際過程中,

接下來,你可以乘以7的隨機的,將永遠是一個多7,但是,如果這種乘法會導致int的溢出(可能會出現隨機數),您可以始終採用前幾位的掩碼並將它們相乘。

例如

randomNumber = (generatedRandom & 0x00FFFFFF) * 7