【问题标题】:Implemenation for BorlandC rand()Borland C rand() 的实现
【发布时间】:2013-02-03 12:15:30
【问题描述】:

有人知道 Borland C++ 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

【问题讨论】:

  • 简单拆解怎么样?
  • 你为什么想知道?有许多不同的方法可以产生伪随机数。大多数是具有不同类型常量的乘法和累加序列。
  • 我最后的希望可能是使用反汇编程序。使用这个特定实现的原因很简单:只是为了让我的(非常!)旧代码与不同的编译器兼容。

标签: c random borland-c++


【解决方案1】:

这是我得到的,不确定您的编译器版本是否具有相同的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

【讨论】:

  • 补充说明:在 TurboC 4.5 中,srand() 不调用 rand()。我最大的错误是不正确的测试。您的回答让我更加努力,我终于在之前的测试中意识到了一个错误.. 再次感谢!
猜你喜欢
  • 2013-10-13
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多