回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++教程 >> C/C++ 技巧 >> [C/C++ 技巧] 产生随机数的方法
最 近 更 新
[转][C++] 巧用 mutable推荐
[C++] 巧用模板定义谓词
巧用异或交换整型变量的值
宏的一个妙用
[C/C++ 技巧] 提高程序..推荐
[C/C++ 技巧] 产生随机..
[C/C++技巧]巧用数组减..推荐
巧用移位运算避免乘法运算
无条件循环
最 新 推 荐
[转][C++] 巧用 mutable推荐
[C/C++ 技巧] 提高程序..推荐
[C/C++技巧]巧用数组减..推荐
热 门 排 行
[C/C++ 技巧] 产生随机..
[C/C++ 技巧] 提高程序..推荐
巧用移位运算避免乘法运算
[C/C++技巧]巧用数组减..推荐
宏的一个妙用
[转][C++] 巧用 mutable推荐
无条件循环
巧用异或交换整型变量的值
[C++] 巧用模板定义谓词
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

[C/C++ 技巧] 产生随机数的方法


来源:sourceforge 作者:Steve Summit 等级:精品
发布于2005-10-27 22:47 被读9883次 【字体:

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 点。

本文乃网上搜集得来,其版权归原作者和原出处所有。如有侵犯版权之处请与我联系,我将马上进行处理。



相关专题:暂无相关专题

上一篇:[C/C++技巧]巧用数组减少if语句
下一篇:[C/C++ 技巧] 提高程序效率的方法

共有评论 6 条 网友评分 1分 查看全部评论

游客:Ihavegotyou
评分:1
  rand() / (RAND_MAX / N + 1);
   应该是: rand() % (RAND_MAX %N+1)
游客:antigloss
评分:4
的确是 rand() / (RAND_MAX / N + 1); 没错
您认真看一下,想一下就明白了
rand() % (RAND_MAX %N+1) 反而是错的
游客:xiehe
评分:0
不懂为什么
rand() % (RAND_MAX %N+1) 反而是错的
虽然这个输出的似乎是伪随机数,但是
rand() / (RAND_MAX / N + 1);输出的总是0,奇怪
游客:xiehe
评分:0
从原理上来理解
如果rand()是伪随机的话,
rand() / (RAND_MAX / N + 1);  这个式子还是只能是伪随机
游客:antigloss
评分:0
你算一下 rand() % (RAND_MAX %N+1) 得到的是什么就知道了。用 rand() % (RAND_MAX %N+1) 不能达到返回从 0 到 N - 1 的数字这个目的。

在 rand() / (RAND_MAX / N + 1); 前面加上
    #include <time.h>
    srand((unsigned int)time((time_t *)NULL));
输出就不会总是零了,而且产生的随机数每次都不同
游客:菜鸟爱CPP
评分:0
想取0~N-1之间的随机数不可以用rand()%((N-1)-0)+0?

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss