如何让rand()产生更大范围的伪随机数?

pz239 2013-05-20 01:53:51
由于rand()产生的随机数的范围受到RAND_MAX的约束,在windows下能产生随机数的最大范围是[0,32767],如何让rand()产生更大范围的伪随机数呢,比如[0,50000]?请各位大神赐教!
...全文
730 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimye 2013-05-23
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
[quote=引用 7 楼 left_la 的回复:] 简单点,这样就拉倒了
int BigRand()
{
	return RAND_MAX*rand() + rand(); 
}
有越界和分布不均匀问题。[/quote]1、RAND_MAX*rand() + rand(); 所求随机数范围是[0,1073709056],未越界 2、至少在[0,1073709056]之间均匀分布的吧
jimye 2013-05-23
  • 打赏
  • 举报
回复
1、RAND_MAX*rand() + rand(); 所求随机数范围是[0,1073709056],未越界 2、至少在[0,1073709056]之间均匀分布的吧
Yalye 2013-05-23
  • 打赏
  • 举报
回复
抱歉,我刚问的问题,太弱了,刚没想到....
Yalye 2013-05-23
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
So easy!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned long ulrand(void) {
    return (
     (((unsigned long)rand()<<24)&0xFF000000ul)
    |(((unsigned long)rand()<<12)&0x00FFF000ul)
    |(((unsigned long)rand()    )&0x00000FFFul));
}
int i;
unsigned long ul;
void main() {
    srand(time(NULL));
    for (i=0;i<10;i++) {
        ul=ulrand();
        printf("%010lu 0x%08x\n",ul,ul);
    }
}
谢谢, 如果要生成指定最大值的随机数呢?请问赵老师会怎么做呢?
zjutyf 2013-05-23
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
So easy!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned long ulrand(void) {
    return (
     (((unsigned long)rand()<<24)&0xFF000000ul)
    |(((unsigned long)rand()<<12)&0x00FFF000ul)
    |(((unsigned long)rand()    )&0x00000FFFul));
}
int i;
unsigned long ul;
void main() {
    srand(time(NULL));
    for (i=0;i<10;i++) {
        ul=ulrand();
        printf("%010lu 0x%08x\n",ul,ul);
    }
}
//2337588057 0x8b54c359
//1977377429 0x75dc6295
//3607316769 0xd7034921
//0009828482 0x0095f882
//3350859779 0xc7ba1003
//0945794621 0x385fae3d
//3400869024 0xcab524a0
//3097846779 0xb8a563fb
//4287421124 0xff8cdac4
//3934016258 0xea7c5302
受教了
赵4老师 2013-05-23
  • 打赏
  • 举报
回复
引用 7 楼 left_la 的回复:
简单点,这样就拉倒了
int BigRand()
{
	return RAND_MAX*rand() + rand(); 
}
有越界和分布不均匀问题。
jimye 2013-05-23
  • 打赏
  • 举报
回复
简单点,这样就拉倒了
int BigRand()
{
	return RAND_MAX*rand() + rand(); 
}
hugett 2013-05-23
  • 打赏
  • 举报
回复
rand多几次,再把它们乱搞一下就可以变成一个更大的随机数了。。 给你一种简单的思路,这样可以随机一个9位数。。

int Rand(){
	int n = 9, ret = 0;
	for(int i = 0; i < n; ++i) ret = ret * 10 + rand() % 10;
	return ret;
}
疯掉的灰太狼 2013-05-23
  • 打赏
  • 举报
回复
恩,围观高手答题
绯红女王 2013-05-22
  • 打赏
  • 举报
回复
赵老师 还是如此牛叉,回答这种问题,完全不给我们机会啊~~
startservice 2013-05-21
  • 打赏
  • 举报
回复
顶1L......
xiaohuh421 2013-05-20
  • 打赏
  • 举报
回复
多次调用rand函数即可. 然后通过位移组合起来.
赵4老师 2013-05-20
  • 打赏
  • 举报
回复
So easy!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned long ulrand(void) {
    return (
     (((unsigned long)rand()<<24)&0xFF000000ul)
    |(((unsigned long)rand()<<12)&0x00FFF000ul)
    |(((unsigned long)rand()    )&0x00000FFFul));
}
int i;
unsigned long ul;
void main() {
    srand(time(NULL));
    for (i=0;i<10;i++) {
        ul=ulrand();
        printf("%010lu 0x%08x\n",ul,ul);
    }
}
//2337588057 0x8b54c359
//1977377429 0x75dc6295
//3607316769 0xd7034921
//0009828482 0x0095f882
//3350859779 0xc7ba1003
//0945794621 0x385fae3d
//3400869024 0xcab524a0
//3097846779 0xb8a563fb
//4287421124 0xff8cdac4
//3934016258 0xea7c5302

69,373

社区成员

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

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