真正实时随机数的实现C++ _timeb _ftime(转)

通常大家使用随机函数的时候都是使用

srand((unsigned  short   int )time(NULL));

   rand();

   在大部分的应用中都能很好用。但是当遇到时间性很强的时候。比如操作速度很快的游戏。这个随机方法就不好用了。

  因为它有时间间隔。如果时间在1秒或更短的时间调用这个,它返回的随机数是一样的。

   给大家一个实时性很强的随机方法

struct  _timeb 

    time_t time; 
    unsigned 
short  millitm; 
    
short  timezone, dstflag; 
};

time是从UTC时间1970年1月1日午夜(00:00:00)起累计的秒数;
millitm是一秒内的毫秒数
dstflag不为0,说明这是夏令时时间
timezone是UTC时间和本地时间的相差分钟数

利用其中的毫秒。基本上不会有重复的数字出现。

example:

struct  _timeb timebuffer; // 定义一个结构

_ftime(
& timebuffer); // 初始化timebuffer

srand(timebuffer.millitm);
// timebuffer.millitm获得毫秒

int  a = rand();

记得包含头文件

#include  < sys / timeb.h >    // _ftime 无返回值,但获得本地的时间数据并且填充进传递进来指向时间结构的变量中

#include 
< time.h >  

 

转载于:https://www.cnblogs.com/wanghao111/archive/2009/05/25/1489018.html

### C++ 中设置随机种子 `srand` 和生成随机数的方法 在 C++ 编程中,可以通过标准库中的 `srand` 函数设置随机种子,并通过 `rand` 函数生成伪随机数。以下是关于如何使用这两个函数的具体说明以及示例代码。 #### 随机种子的作用 为了使每次程序运行时产生的随机序列不同,通常会使用当前时间作为随机种子。这可以借助 `<ctime>` 头文件中的 `time` 函数实现[^5]。如果未设置不同的种子,则每次执行程序都会得到相同的随机数序列[^4]。 #### 示例代码展示 下面是一段完整的代码示例,演示了如何利用当前时间为种子来生成一系列随机整数: ```cpp #include <iostream> #include <cstdlib> // 包含 srand 和 rand 的定义 #include <ctime> // 包含 time 的定义 int main() { // 使用当前时间作为种子 srand(static_cast<unsigned>(time(nullptr))); // 生成并打印10个随机数 for (int i = 0; i < 10; ++i) { int randomValue = rand(); std::cout << randomValue << std::endl; } return 0; } ``` 此代码片段设置了基于系统时间的随机种子,并循环十次调用 `rand()` 来输出十个随机数值[^1]。 #### 更精确的时间粒度 对于更高精度的需求,还可以采用毫秒级时间戳作为种子值。这种方法能够进一步减少重复的可能性: ```cpp #include <iostream> #include <cstdlib> #include <sys/timeb.h> int main(){ struct timeb timeSeed; ftime(&timeSeed); // 将时间和毫秒组合成更精细的种子 srand(timeSeed.time * 1000 + timeSeed.millitm); unsigned int crand = rand(); std::cout << "Random number with millisecond precision seed: " << crand << std::endl; return 0; } ``` 上述代码采用了结构体 `struct timeb` 获取更为细致的时间信息用于初始化随机数发生器[^3]。 #### 关于伪随机性的注意事项 值得注意的是,尽管我们讨论的是“随机”数生成过程,但实际上这些数字是由确定性算法计算出来的结果——即所谓的 **伪随机数** 。因此,在某些安全性要求较高的场景下可能并不适用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值