2013-08-22 36 views
0

如何在不使用標準C函數(如時間函數,靜態變量或全局變量)的情況下編寫隨機生成器函數?如何在不使用時間函數,靜態變量或全局變量的情況下編寫隨機生成器函數?

/* #include <time.h> Don't use time functions. */ 
/* int seed = 1234; Don't use global variables. */ 
int generate_random(void) 
{ 
    /* static int seed = 1234; Don't use static variables. */ 
    /* return (time() % 100); Don't use time functions. */ 
} 

換句話說,這個random generator function應該不記得最後一個狀態。

+0

您對設計,然後嘗試寫... –

+1

這裏:無需使用任何外部函數生成隨機數(http://stackoverflow.com/questions/15038174/generate- random-numbers-without-using-any-external-functions/15040471#15040471)我建議一些有用的源碼來編寫隨機函數 –

+0

目標是什麼?如果它是真正隨機的,它應該基於硬件噪聲發生器。在某些操作系統上,有一個設備可以收集可以使用的隨機數據.... – wallyk

回答

0

#include <time.h> 
#include <stdlib.h> 

srand(time(NULL)); 
int r = rand(); 

如果要限制使用次數

int r = minNum + rand() % maxNum; 

不要試圖創建自己的隨機函數。它不會有好下場

+5

你讀過這些限制嗎?它說沒有時間函數。 – wallyk

2

你也可以使用函數srand通過

#include<stdlib.h> 

srand(getpid()); 

int num = rand(); 
+0

如果練習的要點是爲了避免全局狀態,srand/rand將不起作用,因爲它們在內部使用全局狀態。 – user694733

-1

猜測你的問題......我要問什麼是想要一個隨機種子的需求?

能夠設置種子值是代碼的一個優點,因爲您至少會嘗試執行迴歸測試等操作。

如果你的問題是關於一般的隨機數。生成一系列隨機數需要兩個步驟。

首先,設置種子值,例如,srand(1234);其中1234是種子值。你的代碼只發布一次這個指令。當您第二次運行程序時,您的代碼可以重新使用相同的種子值,在這種情況下,隨機數序列將相同。如果你設置了不同的種子,那麼你將得到一個不同的隨機數序列。

第二步是檢索在您的代碼中使用的隨機數值。

一種可能的方法

在理論上,可以使用固定的種子值,然後產生R個隨機數,其中R是some number taken from the system模100(例如)。然後使用該R'th隨機數作爲您的應用程序的實際隨機數序列的種子值。

你說你不想使用Time(),但也許在這個雙序列的隨機數和Time() mod n函數將提供足夠的隨機性。

現在我在理論上說,因爲從rand()的隨機數實際上是隨機的,對於所有的意圖和目的,它們確實是隨機的(有數學博士的人說這個......),所以我懷疑是否這樣做「雙選「會使數字更隨機。但是,這種方法或者像這樣的方法可能會使評論員或老闆感覺更舒適,但這是一種虛假的安全感。

0

假設你需要做自己的僞隨機數發生器, 你需要記住狀態。

如果功能不應該還記得去年的狀態,你需要把它作爲參數傳遞:

int generate_random(int * lastState) 
{ 
    // generate next random from lastState 
    // store state to lastState 
    // return result 
} 

int main(void) 
{ 
    int lastState = 1234; // seed it 
    int random = generate_random(&lastState); 
} 
1

該解決方案滿足您的所有標準,但它確實需要互聯網。 *

unsigned generate_random() { 
    FILE *random; 
    char cmd[512]; 
    unsigned number; 

    snprintf(cmd, sizeof(cmd), 
     "wget -qO - " 
     "'http://www.random.org/integers/" 
     "?num=1&min=0&max=%u&col=1&base=10&format=plain&rnd=new'", 
     USHRT_MAX); 

    random = popen(cmd, "r"); 
    fscanf(random, "%u", &number); 
    pclose(random); 

    return number; 
} 

*這不是真的對算法的標誌,不過,因爲互聯網是隨機數據的極好來源。 ;-)

相關問題