首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于随机数的问题 [已结贴,结贴人:hyh563948446]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hyh563948446
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-23 22:45:22 楼主
    各位朋友
    小弟想请教一个问题
    在C语言中有个随机数和伪随机数
    我不明白意思
    麻烦各位朋友解释一下
    随机数和伪随机数
    谢谢!1
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 6

    发表于:2008-08-23 22:48:411楼 得分:0
    计算机生成的随机数都是伪的,不是真正的随机
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wangdeqie
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 22:48:542楼 得分:20
    1. 如何产生一定范围内的随机数?

    直接的方法是:

        rand() % N;

    返回从 0 到 N - 1 的数字。但这个方法不好,因为许多随机数发生器的低位比特并不随机。一个较好的方法是:

        (int)((double)rand() / ((double)RAND_MAX + 1) * N);

    如果你不希望使用 double,另一个方法是:

        rand() / (RAND_MAX / N + 1);

    两种方法都需要知道 RAND_MAX,而且假设 N 要远远小于 RAND_MAX。ANSI 规定标准头文件 stdlib.h 中包含 RAND_MAX 的 #define。顺便提一下,RAND_MAX 是个常数,它告诉你 C 库函数 rand() 的固定范围。你不可以设 RAND_MAX 为其它的值,也没有办法要求 rand() 返回其它范围的值。如果你用的随机数发生器返回的是 0 到 1 的浮点值,要取得范围在 0 到 N - 1 内的整数,只要将随机数乘以 N 就可以了。


    2. 为什么每次执行程序,rand() 都返回相同顺序的数字?

        你可以调用 srand() 来初始化伪随机数发生器的种子,传递给 srand() 的值应该是真正的随机数,例如当前时间:

        #include <stdlib.h>
        #include <time.h>
        srand((unsigned int)time((time_t *)NULL));

    请注意,在一个程序执行中多次调用 srand() 并不见得有帮助!不要为了取得“真随机数”而在每次调用  rand() 前都调用 srand()!


    3. 我需要随机的真/假值,所以我用直接用 rand() % 2,可是我得到交替的 0, 1, 0, 1, 0 。

        这是个低劣的伪随机数生成器,在低位比特中不随机!很不幸,某些系统就提供这样的伪随机数生成器。请试着使用高位比特,具体请参考本文第 1 点。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ga6840
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 23:20:133楼 得分:0
    我学的高三数学就有一个随机数表
    伪随机数 是根据随机数表 深成的
    结果是有寻找规则的
    要使执行有不同的结果
    用time函数得到一个关于现在距开机时刻的毫秒数 来初始化随机数发生器的种子
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bitxinhai
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 09:15:414楼 得分:0
    计算机生成的随机数都是伪的,不是真正的随机!!!
    每次生成的数都是一样的,因为他们的种子一样,
    使用时间作为种子就可以生产真正的随机数,
    srand(time(NULL));
    int a = rand(100);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qqwx_1986
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 09:19:125楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 09:35:336楼 得分:0
    引用 4 楼 bitxinhai 的回复:
    计算机生成的随机数都是伪的,不是真正的随机!!!
    每次生成的数都是一样的,因为他们的种子一样,
    使用时间作为种子就可以生产真正的随机数,
    srand(time(NULL));
    int a = rand(100);

    就算用时间做种子,也不会产生真正的随机数,
    计算机内只能产生“伪随机数”。

    以下摘自百度百科:
    伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。(严格地说,这里的计算机是指由冯诺依曼思想发展起来的电子计算机。而未来的量子计算机有可能产生基于自然规律的不可重现的“真”随机数)

    详见:http://baike.baidu.com/view/1127.htm
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jia_xiaoxin
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 12:07:107楼 得分:0
    因为C语言中的随机数是模拟产生的,所以叫伪随机数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nwpulei
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 12:15:158楼 得分:0
    "伪随机数",用函数产生的.用同一个种子产生几个数字时,表面看起来是随机的.但是多了以后就会发现竟然会循.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanfustudio
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      2

    发表于:2008-08-24 12:16:049楼 得分:0
    所谓伪随机数,是因为“随机数”都不是随机的,而是通过公式计算出来的
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved