关于rand()函数的疑问

k163x 2009-10-06 08:27:40
看《C Programming Language》,上面有rand()函数的实现过程,但是我没看懂啊。。
unsigned long int next = 1; //种子

int rand ( void)
{
next = next * 1103515245 + 12345;
return (unsigned int ) (next / 65536) % 32768; //可见产生的随机数是不大于 32768;
}

如果种子是1的话,这个公式算出来的值是多少啊??怎么算的啊??
...全文
114 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
火山1009 2009-10-07
  • 打赏
  • 举报
回复
...................
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 k163x 的回复:]
但是我在vc6++上编写的程序得到的随机数是41啊 ,而不是16838
代码如下:
#include <stdio.h>
#include <stdlib.h>

void main()
{


printf("%d\n",rand());
}
[/Quote]
VC6的实现是
static long holdrand = 1L;
void __cdecl srand (
unsigned int seed
)
{
holdrand = ( long )seed;
}
int __cdecl rand (
void
)
{
return( ( ( holdrand = holdrand * 214013L + 2531011L ) >> 16 ) & 0x7fff );
}



adolthor 2009-10-06
  • 打赏
  • 举报
回复
应该是rand函数不同的编译器有不同的实现,C语言标准应该没有规定如何实现。
k163x 2009-10-06
  • 打赏
  • 举报
回复
但是我在vc6++上编写的程序得到的随机数是41啊 ,而不是16838
代码如下:
#include <stdio.h>
#include <stdlib.h>

void main()
{


printf("%d\n",rand());
}
coolskyboy 2009-10-06
  • 打赏
  • 举报
回复
算出next的值 next = next * 1103515245 + 12345 这时next=1103527590 强制转换为无符号整数的话 就是 把小数部分省去 得到16838 然后再与32768取摸计算。。
  • 打赏
  • 举报
回复
建议再从头看《C Programming Language》

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧