- 浏览: 1091654 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (695)
- 心情日记 (14)
- AS开发工具 (12)
- 文章转载 (99)
- AIR (5)
- 问题总结 (46)
- SWF格式 (7)
- 测试总结 (10)
- 外文资料 (9)
- 算法技术 (33)
- AS3常用开源库 (43)
- 源码范例 (102)
- FLEX (72)
- FLASH 优化 (33)
- 游戏开发 (49)
- 开发技术 (11)
- 工作应用 (34)
- AS3收集 (140)
- WebBase (0)
- 开发构想 (4)
- 设计模式 (2)
- 框架和框架范例 (19)
- RED5 (3)
- java开发 (3)
- JAVA (1)
- FLASH-3D (23)
- 3D (6)
- 书籍 (10)
- 业界信息资料 (3)
- C# (1)
- JavaScript (12)
- HTML5 (6)
- Flixel (1)
- D5Power RPG网页游戏引擎 (0)
- ColorMatrixFilter - 获得相应颜色的色调 函数 (0)
- Starling (0)
最新评论
-
老顽童203:
字体
水果忍者鼠标跟随特效制作[转载] -
hairball00:
[转] 放出超多的Flash组件源代码 -
he74552775:
flash AS3 RegExp简单功能用法(转) -
hanshuai1232000:
第四点,有利也有弊,等你做了大型的aprg,你就知道了
[转]位图数据内存优化 -
yangfantao:
太感谢
[转] 放出超多的Flash组件源代码
http://uh.9ria.com/space-12147-do-blog-id-4007.html
计算机是无法计算“真”随机数的,而只能计算“伪”随机数。所谓伪随机数,并不是按投硬币的方法来实现,而是从一个特定数开始,通过算法从一个“随机值”计算另一个“随机值”,并保证两者关系尽可能看上去混乱而且最终在区间内数值分配均匀。
因为伪随机数是按上一个数作为参数计算出来的,所以它需要一个初值,而这个初值则被称为“随机种子”。一般这个随机种子都是取的当前系统时间。也就是说,两台电脑在同一毫秒初始化并生成的第一个随机数一定是同一个。
因为伪随机数仅仅是计算得到的,它除了随机种子外并没有偶然性。如果你给定一个随机种子,通过这个随机种子计算出的所有“随机数”一定都是一样的。
一般的语言其实都是有设置“随机种子”的功能的,但AS3没有,所以只能自己实现随机算法。如果想利用伪随机数的特性,可以用下面这个类来生成随机数(创建后用nextInt方法,参数是大小范围)
http://code.google.com/p/ghostcat/source/browse/trunk/GhostCat/src/ghostcat/util/RandomSeed.as
下面我就来说说利用这个特性能做什么。
比如我们需求要显示一个电影院的所有观众,他们有多种类型,会坐在不同的地方,不同的进入和离开时间。而服务端并不关心影院的具体情况,只需要你显示出正确的人数即可。那么,它就不需要计算出所有的信息并传递到客户端,而是让客户端自己随意生成,也就是使用随机数生成。但问题是,如果简单使用随机数生成而不保存状态,关闭游戏再进,或者在别的玩家眼里,看到的影院状态就会完全不同(除了总人数)
这时候就可以利用伪随机数。然服务端生成一个随机数保存起来来作为随机种子,客户端使用这个种子来生成自己需要的随机数序列。因为同样种子生成的随机数序列一定是相同的,那么就可以重现第一次生成影院状态的过程,并得到相同的结果。
计算机是无法计算“真”随机数的,而只能计算“伪”随机数。所谓伪随机数,并不是按投硬币的方法来实现,而是从一个特定数开始,通过算法从一个“随机值”计算另一个“随机值”,并保证两者关系尽可能看上去混乱而且最终在区间内数值分配均匀。
因为伪随机数是按上一个数作为参数计算出来的,所以它需要一个初值,而这个初值则被称为“随机种子”。一般这个随机种子都是取的当前系统时间。也就是说,两台电脑在同一毫秒初始化并生成的第一个随机数一定是同一个。
因为伪随机数仅仅是计算得到的,它除了随机种子外并没有偶然性。如果你给定一个随机种子,通过这个随机种子计算出的所有“随机数”一定都是一样的。
一般的语言其实都是有设置“随机种子”的功能的,但AS3没有,所以只能自己实现随机算法。如果想利用伪随机数的特性,可以用下面这个类来生成随机数(创建后用nextInt方法,参数是大小范围)
http://code.google.com/p/ghostcat/source/browse/trunk/GhostCat/src/ghostcat/util/RandomSeed.as
下面我就来说说利用这个特性能做什么。
比如我们需求要显示一个电影院的所有观众,他们有多种类型,会坐在不同的地方,不同的进入和离开时间。而服务端并不关心影院的具体情况,只需要你显示出正确的人数即可。那么,它就不需要计算出所有的信息并传递到客户端,而是让客户端自己随意生成,也就是使用随机数生成。但问题是,如果简单使用随机数生成而不保存状态,关闭游戏再进,或者在别的玩家眼里,看到的影院状态就会完全不同(除了总人数)
这时候就可以利用伪随机数。然服务端生成一个随机数保存起来来作为随机种子,客户端使用这个种子来生成自己需要的随机数序列。因为同样种子生成的随机数序列一定是相同的,那么就可以重现第一次生成影院状态的过程,并得到相同的结果。
package ghostcat.util { import flash.utils.ByteArray; /** * 伪随机数 * @author flashyiyi * */ public class RandomSeed { private static const MULTIPLIER_HIGH:uint=5; private static const ADDEND:uint=11; private static const MULTIPLIER_LOW:uint=58989; private static const MULTIPLIER_MID:uint=57068; private var seedHigh:uint; private var seedLow:uint; private var seedMid:uint; private static var seedExtra:uint=2353648897; public function RandomSeed(high:uint=0x80000000, low:uint=0) { if (high == 0x80000000 && low == 0) { var bytes:ByteArray = new ByteArray(); bytes.writeDouble(new Date().time); bytes.position = 0; high = bytes.readUnsignedInt() + seedExtra; low = bytes.readUnsignedInt() + (high >>> 16); seedExtra++; } setSeed(high, low); return; } public function setSeed(high:uint, low:uint):void { this.seedHigh = high & 65535 ^ MULTIPLIER_HIGH; this.seedMid = low >> 16 & 65535 ^ MULTIPLIER_MID; this.seedLow = low & 65535 ^ MULTIPLIER_LOW; return; } private function next(max:uint):uint { var v2:Number = 0; var v3:Number = 0; var v4:Number = 0; v4 = seedLow * MULTIPLIER_LOW; v2 = seedLow * MULTIPLIER_HIGH + seedMid * MULTIPLIER_MID + seedHigh * MULTIPLIER_LOW; v3 = seedLow * MULTIPLIER_MID; v2 = v2 + (v3 >>> 16); v3 = v3 & 65535; v3 = v3 + seedMid * MULTIPLIER_LOW; v2 = v2 + (v3 >>> 16); v3 = v3 & 65535; v3 = v3 + (v4 >>> 16); v2 = v2 + (v3 >>> 16); v4 = v4 & 65535; v3 = v3 & 65535; v2 = v2 & 65535; v4 = v4 + ADDEND; v3 = v3 + (v4 >>> 16); v2 = v2 + (v3 >>> 16); v4 = v4 & 65535; v3 = v3 & 65535; v2 = v2 & 65535; seedLow = v4; seedMid = v3; seedHigh = v2; if (max == 0) return 0; return (v2 << 16 | v3) >>> 32 - max; } public function nextInt(max:int):uint { var v2:Number = 0; var v3:Number = 0; if (max == 0 || !((max & 2147483648) == 0)) throw new Error(); if ((max & -max) == max) { v2 = 0; if ((max & 4294901760) != 0) { v2 = v2 + 16; } if ((max & 4278255360) != 0) { v2 = v2 + 8; } if ((max & 4042322160) != 0) { v2 = v2 + 4; } if ((max & 3435973836) != 0) { v2 = v2 + 2; } if ((max & 2863311530) != 0) { v2 = v2 + 1; } return next(v2); } do { v2 = next(31); v3 = v2 % max; } while ((v2 - v3 + max - 1) < 0); return v3; } } }
发表评论
-
HttpStatusConfig --一个HTTP 协议返回的 解析说明类
2012-04-18 16:40 0package guwanyuan.qicool.game ... -
水果忍者鼠标跟随特效制作[转载]
2012-03-01 16:06 2470实现这效果其实比较简单,主要是思路~! package ... -
江湖情缘游戏里的跳的类
2012-02-08 23:55 0package com.app.role.montions ... -
ColorMatrixFilter - 获得相应颜色的色调 函数
2012-02-08 23:03 0/**获得相应颜色的色调的滤镜**/ public sta ... -
ARPG游戏引擎设计思路
2011-12-31 00:48 00.整体结构 下载 (32.92 KB ... -
五子棋算法详解
2011-10-31 04:14 0五子棋算法详解五子棋算法详解五子棋算法详解 -
[原创]围绕任意一个中心点旋转
2011-10-23 13:46 0package guwanyuan.qicool.game.c ... -
珍宝探索 AS3-过关类小游戏
2011-10-13 02:15 0珍宝探索 AS3-过关类小游戏 -
(RepeaterOverTimeLine能将一个for循环执行的工作类似异步地平摊到多个帧上)RepeaterOverTimeLine
2011-09-30 02:26 0(RepeaterOverTimeLine能将一个for循环执 ... -
box2dttest(台球demo,使用了box2d)
2011-09-21 01:49 0box2dttest(台球demo,使用了box2d) -
贪吃蛇游戏
2011-09-16 02:40 0package com { /** ... -
打豆豆
2011-09-08 00:34 0打豆豆打豆豆 -
经典代码-空战.zip (513.2 KB)
2011-09-02 02:24 0经典代码-空战.zip (513.2 KB) -
基于TextField的图文混编的组件
2011-09-01 23:04 0基于TextField的图文混编的组件 -
泡泡龙
2011-08-29 22:36 0泡泡龙泡泡龙泡泡龙 -
井字棋算法
2011-08-18 15:04 0井字棋算法井字棋算法 -
_超级玛丽游戏_flash_game_demo
2011-08-18 00:01 0_超级玛丽游戏_flash_game_demo.zip -
吴万江-TD_demo
2011-08-15 15:35 0吴万江-TD_demo -
S_eVent系列教程
2011-08-13 05:01 0S_eVent系列教程S_eVent系列教程 -
[转][翻译]LoaderMax使用指导(一)
2011-08-10 19:51 1915http://hi.baidu.com/mr_ziqiang/ ...
相关推荐
4. **随机数生成**:打乱魔方的过程可能依赖于随机数生成,这需要了解如何在Java中生成伪随机数。 5. **错误修复**:识别和修复“创建中断模式”的错误是软件开发的重要部分,这涉及到调试技巧和理解程序执行流程。...
- **堆栈**:一种特殊的内存区域,用于保存函数调用过程中的状态信息。 - **FLASH**:非易失性存储器,用于存放程序代码和常量数据。 ##### 2.3 SPCE061A的输入/输出接口 - **I/O端口结构**:支持数字输入输出。 - ...
`random`模块提供了生成伪随机数的函数。 ##### 2.17 whrandom模块 `whrandom`模块提供了基于Mersenne Twister算法的随机数生成器。 ##### 2.18 md5模块 `md5`模块提供了MD5哈希函数,用于生成消息摘要。 #####...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...