random函数随想(游戏中的随机数)

来源:互联网 发布:淘宝泊泉雅都是假的吗 编辑:程序博客网 时间:2024/05/21 02:20

写在前面:

上周与服务器端的同事讨论到游戏中用到的随机数的问题。

他随口问我,你最近玩的手游有没有发现装备的洗练中有没有发现什么规律?(由于是自己公司别的项目的产品,游戏名就不安利了,大概就参考征途,传奇这类游戏开创的武器强化之类的系统)

我,你是指哪方面?

他,随机生成的数值。

我,倒是没有,不过我在上一个公司的项目中时,好像调试游戏的过程中发现随机生成的数值有时会出现数值相同的情况,当时借机查了一些随机函数,伪随机数方面的资料,大概是因为随机数生成器的种子总是采用同一个数值造成的吧。

他,是的,其实我们项目中的随机函数也会有这种情况,你有没有考虑过为什么会这样?

我,常用的做法不应该是将当前时间作为种子来产生随机数么?怎么会产生这种现象?

他,确实是这样,不过一般情况下,对于多人实时在线的网络游戏来说,服务端并不会采用这种方式,主要是基于效率方面的因素考虑。所有客户端请求随机数,服务端都是根据同一个种子来生成随机数。

我,换种说法就是将种子的随机性转移到了客户端的随机性上,虽然不同的客户端请求到的随机数合并到一起是同一个随机序列(同一随机序列是指服务端重启后,随机函数的种子被重置),而对于单个客户端个体而言,获得的随机数却跟每次用不同种子生产的随机序列效果相当。此外,在线的客户端数量越大,服务端省却的开销也越大。

他,bingo!

自己玩手游的一点小猜想,目前市场上主流的卡牌类RPG游戏,一个区稳定下来也就几百个玩家,在深更半夜的时候自己洗练装备会不会就是自己一台客户端在请求服务端的随机函数呢?o(╯□╰)o 这么一想,整个人都不好了,感觉装备洗练完全没有意思啊啊啊~~~


下面是刚才在CSDN上看到的文章,基本上比较清晰的描述了随机函数的情况,附在下面做个参考吧。

原文地址:random函数

一、rand()函数概述

     1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试
      2、C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。
     3、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。
// C++随机函数(VC program)
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;
#define MAX 100
int main(int argc, char* argv[])
{
       srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子.应该放在for等循环语句前面 不然要很长时间等待
for (int i=0;i<10;i++)
cout<<rand()%MAX<<endl;//MAX为最大值,其随机域为0~MAX-1
   return 0;
}
二、rand()的用法
     rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。这样,如果你要产生0~10的10个整数,可以表达为:
int N = rand() % 11;
     这样,N的值就是一个0~10的随机数,如果要产生1~10,则是这样:
int N = 1 + rand() % 11;
总结来说,可以表示为:
a + rand() % n
     其中的a是起始值,n是整数的范围。
  a + rand() % (b-a+1) 就表示 a~b之间的一个随机数
若要0~1的小数,则可以先取得0~10的整数,然后均除以10即可得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则需要先得到0~100的10个整数,然后均除以100,其它情况依
此类推。
     通常rand()产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。若要产生每次不同的随机数,可以使用srand( seed )函数进行随机化,随着seed的不同,就能够产生不同的随机数。
     如大家所说,还可以包含time.h头文件,然后使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)。
0 0
原创粉丝点击