2013-02-03 34 views
2

任何人都知道Borland C++ rand()函數的具體實現嗎?BorlandC rand()的實現

我嘗試了以下方法,但結果與我用真正的TurboC 4.5得到的結果不相似。當然,我嘗試了不同變體的代碼,但沒有成功。

unsigned int seed = 1; 

void srand(unsigned int newSeed) { 
    seed = newSeed; 
} 

#define MAX_RAND 0x7FFF; 

unsigned int lrand() 
{ 
    int a = 22695477; 
    int c = 1; 
    seed = (a * seed + c); 
    return seed; 
} 

unsigned int rand() { 
    return (lrand() >> 16) & MAX_RAND; 
} 

http://en.wikipedia.org/wiki/Linear_congruential_generator

+4

如何簡單地拆解它? –

+0

你爲什麼想知道?有許多不同的方式來產生僞隨機數。大多數是一系列不同類型常量的乘法和積累。 –

+1

我最後的希望可能是使用反彙編。使用這個特定實現的原因很簡單:只是爲了讓我的(非常!)舊代碼與不同的編譯器兼容。 – digitalfootmark

回答

3

這裏是我已經有了,不知道你的編譯器的版本有相同的實施rand()srand()

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

/* 
    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 

    srand: 
    push  ebp 
    mov  ebp, esp 
    mov  eax, [ebp + 8] 
    mov  [seed], eax 
    xor  edx, edx 
    mov  [seed + 4], edx ; seed high ? 
    call  rand 
    pop  ebp 
    ret 

    rand: 
    imul  eax, dword [seed], 015A4E35H 
    inc  eax 
    mov  [seed], eax 
    shr  eax, 10H 
    and  eax, 7FFFH 
    ret 

    seed dd 015A4E36H, 0 
*/ 

unsigned int myseed = 0x015A4E36; 

int myrand(void) 
{ 
    unsigned int t = myseed * 0x015A4E35 + 1; 
    myseed = t; 
    return (int)(t >> 16) & 0x7FFF; 
} 

void mysrand(unsigned int seed) 
{ 
    myseed = seed; 
    myrand(); 
} 

int main(void) 
{ 
    unsigned t = time(NULL); 

    printf("%d %d\n", rand(), myrand()); 
    printf("%d %d\n", rand(), myrand()); 
    printf("%d %d\n", rand(), myrand()); 
    printf("%d %d\n", rand(), myrand()); 

    srand(t); 
    mysrand(t); 

    printf("%d %d\n", rand(), myrand()); 
    printf("%d %d\n", rand(), myrand()); 
    printf("%d %d\n", rand(), myrand()); 
    printf("%d %d\n", rand(), myrand()); 

    return 0; 
} 

輸出:

130 130 
10982 10982 
1090 1090 
11656 11656 
23367 23367 
13875 13875 
12650 12650 
13257 13257 
+0

感謝萬阿列克謝!正確的數字:) – digitalfootmark

+0

補充評論:在TurboC 4.5中,srand()不會調用rand()。我最大的錯誤是測試不正確。你的回答讓我更加努力,終於在早期的測試中意識到了錯誤......所以再次感謝! – digitalfootmark