❶ 想用MFC做个俄罗斯方块,没思路。
先生成随机数,比如有5种方块,生成的整数除以5,根据余数生成方块种类,比如0就生成田字方块
❷ random函数怎么用
在python语言中,random函数生成随机数,根据不同的方法生成不同范围的随机数。那么random函数具体怎么使用,操作方法如下。
1、首先在打开的软件中,random.random():返回一个随机数,范围是0到1之间。
❸ 随机数函数如何使用
随机函数就是产生数的函数,是EXCEL中很重要的函数,C语言里也有rand(),srand()等随机函数。(1)生成随机数比较简单,=rand()即可生成0-RAND_MAX之间的随机数;(#define RAND_MAX 0x7fffu)(2)如果要是整数,就用=int(rand()%10),表示0至9的整数,以此类推;(3)如果要生成a与b之间的随机实数,就用=rand()%(b-a+1)+a,就能产生固定位数的整数了,以此类推;注意:如果要使用函数rand()生成一随机数,并且使之不随单元格计算而改变,可以在编辑栏中输入“=rand()”,保持编辑状态然后按F9,将公式永久性地改为随机数。不过,这样只能一个一个的永久性更改,如果数字比较多,也可以全部选择之后,另外选择一个合适的位置粘贴,粘贴的方法是点击右键,选择“选择性粘贴”,然后选择“数值”,即可将之前复制的随机数公式产生的数值(而不是公式)复制下来。
❹ 如何用vc 6.0实现俄罗斯方块游戏
如何用vc 6.0实现俄罗斯方块游戏:
简单说一下算法: 俄罗斯方块由四个小方块组成,假设你定义没每个小方块大小为20 * 20px,方块活动区域大小为:300宽 * 400高,那么你需要定义一个bool型二维数组来标记该活动区域方块的填充情况(以填记1或未填记0),那么该数组可以这么定义:bool isEmpty[20][15]; (20=400/20 15=300/20)。每当方块要落下来时先判断下一个位置是否为空,即 if ( isEmpty[][] == 0 ),若空则允许落下来,否则就停在当前位置,接着生成新的方块,重复刚才判断...... 好了,关于方块活动区域的算法已经大致清楚那么一点了,那么怎么生成一块完整的俄罗斯方块呢?我们知道,漂亮一些的俄罗斯方块通常有多种颜色,最常见的写法是使用GDI的FillRect()函数产生小色块,然后根据4个小方块的坐标填充出一个大的完整的俄罗斯方块(每个俄罗斯方块由四个小方块组成)假如我们要生成“口口口口”(长条),它的坐标可能是(0,0)(1,0)(2,0)(3,0),我们需要定义4个坐标来表示俄罗斯方块:POINT ptBlock[4]; 那么我们把ptBlock里记录的4个坐标填充完就生成一个完整的俄罗斯方块了。 好了,关于怎么生成一个俄罗斯方块我们也了解那么一点了,可是,我们玩游戏的时候不能预知下一块方块是什么形状(这个可以有提示),也就是说每个方块都是随机的,我们该这么做呢? 一般常见的俄罗斯方块有7种形状,那么我们可以每次产生一个0 ~ 6的随机数,然后根据这个数字生成随机方块:int iType = rand() % 7;switch( iType )
❺ 关于俄罗斯方块的问题 数学问题
俄罗斯方块每次出现的方块是有机器随机产生的
这种随机数是由算法产生的
由算法产生的随机数又叫做伪随机数
因为虽然这些数貌似没有什么规律,但是也是由数学算式递推出来的
而且算法产生的随机数十循环的,只是一般来说循环体很长
也就是说如果你可以背出随机数的规律
那么就可以推测俄罗斯方块在n部之后所出现的方块类型
而且这是完全有可能的,冯罗伊曼曾经就多次在计算速度方面胜过埃里阿克
但是也存在这种可能性
就是以后的一段时间内出现的方块无论怎么组合都不能消去
这个只是猜想,没有论证过
而且这也依赖于游戏中设定的方块种类数
❻ 关于俄罗斯方块的随机数问题
近年来大多数俄罗斯方块为了降低游戏难度采用了一种随机发生器叫做BAG。
意思就是说在一开始的时候给7种方块排序后生成一个方块包,随后整个游戏的随机数都会限制在这个方块包里面的不同方块,用完一个包再继续下一个
至于方块包里的方块数根据各个游戏的不同,是不确定的,大多数游戏设定的是7个,有些是8个,如果是7个方块的话那么这7个方块就不可能重复,这样方块包一共就5040种,也就是7的阶乘。所以2个长条之间间隔的其他方块数最多就是12,最小当然是1,而连续出3长条则是不可能出现的
还有像TGM系列这样的游戏,他第一个包里的第一个方块必定是IJLT,不可能是OSZ这样可以最大程度保证开局不可能制造多余的空隙
此外一些其他的游戏用到了其他类型的随机数,那些就比这个复杂多了,而且那些游戏都比较冷门,就不多说了
❼ 随即数表法怎么用
首先要有随机数表(-_-///)随机数表是用随机产生的一系列数据所编制成的数表,记得高中人教版数学课本中有~
使用时是首先随机地确定所用表的页数、行数、列数作为起始点,然后逐行逐列按次序连续选取随机数。
它是简单随机抽样的一种
有个例题:
从高一年级同学450人中随即抽出50人参加一项活动,请用随机数表法抽出人选。
解析:将450个学生编号001,002,003,004.....450然后在随机数表中,依次数三个数,三个数构成的数字编号中有的话,选此学生编号.选出50个号码为止
希望对你有所帮助:-)
❽ 随机数表法怎么用
1、统一编号。
即将总体中的所有研究对象进行统一编号,做成签。 如果研究对象是10以内的,只取1位数,则编号是 1~9;如果研究对象在 1~99 之间的,取 2 位数,则编号是 01~99。
如果研究对象在 1~999 之间的,取 3 位数,则编号是 001~999;其他依次类推。 然后充分混合,目的是使各样本编号均匀分布,符合“机会均等 的原则。
2、确定行名。
研究人员根据自己的需要或意愿,在表上任选一行数字,由该行数字决定起点行的数。如选择25 行,即从上往下第 25 行为起点行。 若选择的数大于 50,则用该数减去 50,将所得余数为起点行。 若选择0 或 00 行,则以第 50 行为起点行。
3、确定列名。
列名的确定方法与行名的确定方法相同。
4、录取号码。
行名和列名决定后,就可以所选择的起始行数和起始列数的交叉点处的数为起始点, 然后, 按一定顺序方向(如自左向右或自右向左,从上往下或由下而上)进行依次录取号码。
遇到大于总体的号码或重复的号码,应该舍去不要,直至录取到所抽取的样本数满额为止。 用上述方法所录取到的号码则是被随机抽中的样本。
(8)俄罗斯随机数怎么用扩展阅读:
优缺点:
1、优点:简单易行.它很好地解决了用抽签法时,当总体中的个体数较多时制签难的问题。
2、缺点:当总体中的个体数很多,需要的样本容量也很大时,用随机数表法抽取样本仍不方便。
❾ 密码那些事
之前在工作中经常用密钥,但是不知道其中的原因,现在闲下来就来看下,再看的过程发现这个随机数概念很模糊,于是就查了下,现总结如下:
0x01 随机数
概述
随机数在计算机应用中使用的比较广泛,最为熟知的便是在密码学中的应用。本文主要是讲解随机数使用导致的一些Web安全风。
我们先简单了解一下随机数
分类
随机数分为真随机数和伪随机数,我们程序使用的基本都是伪随机数,其中伪随机又分为强伪随机数和弱伪随机数。
真随机数,通过物理实验得出,比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等
伪随机数,通过一定算法和种子得出。软件实现的是伪随机数
强伪随机数,难以预测的随机数
弱伪随机数,易于预测的随机数
特性
随机数有3个特性,具体如下:
随机性:不存在统计学偏差,是完全杂乱的数列
不可预测性:不能从过去的数列推测出下一个出现的数
不可重现性:除非将数列本身保存下来,否则不能重现相同的数列
随机数的特性和随机数的分类有一定的关系,比如,弱伪随机数只需要满足随机性即可,而强位随机数需要满足随机性和不可预测性,真随机数则需要同时满足3个特性。
引发安全问题的关键点在于不可预测性。
伪随机数的生成
我们平常软件和应用实现的都是伪随机数,所以本文的重点也就是伪随机数。
伪随机数的生成实现一般是算法+种子。
具体的伪随机数生成器PRNG一般有:
线性同余法
单向散列函数法
密码法
ANSI X9.17
比较常用的一般是线性同余法,比如我们熟知的C语言的rand库和Java的java.util.Random类,都采用了线性同余法生成随机数。
应用场景
随机数的应用场景比较广泛,以下是随机数常见的应用场景:
验证码生成
抽奖活动
UUID生成
SessionID生成
Token生成
CSRF Token
找回密码Token
游 戏 (随机元素的生成)
洗牌
俄罗斯方块出现特定形状的序列
游戏爆装备
密码应用场景
生成密钥:对称密码,消息认证
生成密钥对:公钥密码,数字签名
生成IV: 用于分组密码的CBC,CFB和OFB模式
生成nonce: 用于防御重放攻击; 分组密码的CTR模式
生成盐:用于基于口令的密码PBE等
0x02 随机数的安全性
相比其他密码技术,随机数很少受到关注,但随机数在密码技术和计算机应用中是非常重要的,不正确的使用随机数会导致一系列的安全问题。
随机数的安全风险
随机数导致的安全问题一般有两种
应该使用随机数,开发者并没有使用随机数;
应该使用强伪随机数,开发者使用了弱伪随机数。
第一种情况,简单来讲,就是我们需要一个随机数,但是开发者没有使用随机数,而是指定了一个常量。当然,很多人会义愤填膺的说,sb才会不用随机数。但是,请不要忽略我朝还是有很多的。主要有两个场景:
开发者缺乏基础常识不知道要用随机数;
一些应用场景和框架,接口文档不完善或者开发者没有仔细阅读等原因。
比如找回密码的token,需要一个伪随机数,很多业务直接根据用户名生成token;
比如OAuth2.0中需要第三方传递一个state参数作为CSRF Token防止CSRF攻击,很多开发者根本不使用这个参数,或者是传入一个固定的值。由于认证方无法对这个值进行业务层面有效性的校验,导致了 OAuth 的CSRF攻击。
第二种情况,主要区别就在于伪随机数的强弱了,大部分(所有?)语言的API文档中的基础库(常用库)中的random库都是弱伪随机,很多开发自然就直接使用。但是,最重要也最致命的是,弱伪随机数是不能用于密码技术的。
还是第一种情况中的找回密码场景,关于token的生成, 很多开发使用了时间戳作为随机数(md5(时间戳),md5(时间戳+用户名)),但是由于时间戳是可以预测的,很容易就被猜解。不可预测性是区分弱伪随机数和强伪随机数的关键指标。
当然,除了以上两种情况,还有一些比较特别的情况,通常情况下比较少见,但是也不排除:
种子的泄露,算法很多时候是公开的,如果种子泄露了,相当于随机数已经泄露了;
随机数池不足。这个严格来说也属于弱伪随机数,因为随机数池不足其实也导致了随机数是可预测的,攻击者可以直接暴力破解。
漏洞实例
wooyun上有很多漏洞,还蛮有意思的,都是和随机数有关的。
1.应该使用随机数而未使用随机数
Oauth2.0的这个问题特别经典,除了wooyun实例列出来的,其实很多厂商都有这个问题。
Oauth2.0中state参数要求第三方应用的开发者传入一个CSRF Token(随机数),如果没有传入或者传入的不是随机数,会导致CSRF登陆任意帐号:
唯品会账号相关漏洞可通过csrf登录任意账号
人人网 - 网络 OAuth 2.0 redirect_uir CSRF 漏洞
2.使用弱伪随机数
1) 密码取回
很多密码找回的场景,会发 送给 用户邮件一个url,中间包含一个token,这个token如果猜测,那么就可以找回其他用户的密码。
1. Shopex 4.8.5密码取回处新生成密码可预测漏洞
直接使用了时间函数microtime()作为随机数,然后获取MD5的前6位。
1. substr(md5(print_r(microtime(),true)),0,6);
PHP 中microtime()的值除了当前 服务器 的秒数外,还有微秒数,微妙数的变化范围在0.000000 -- 0.999999 之间,一般来说,服务器的时间可以通过HTTP返回头的DATE字段来获取,因此我们只需要遍历这1000000可能值即可。但我们要使用暴力破解的方式发起1000000次请求的话,网络请求数也会非常之大。可是shopex非常贴心的在生成密码前再次将microtime() 输出了一次:
1. $messenger = &$this->system->loadModel('system/messenger');echo microtime()."
";
2.奇虎360任意用户密码修改
直接是MD5( unix 时间戳)
3.涂鸦王国弱随机数导致任意用户劫持漏洞,附测试POC
关于找回密码随机数的问题强烈建议大家参考拓哥的11年的文章《利用系统时间可预测破解java随机数| 空虚浪子心的灵魂》
2) 其他随机数验证场景
CmsEasy最新版暴力注入(加解密缺陷/绕过防注入)
弱伪随机数被绕过
Espcms v5.6 暴力注入
Espcms中一处SQL注入漏洞的利用,利用时发现espcms对传值有加密并且随机key,但是这是一个随机数池固定的弱伪随机数,可以被攻击者遍历绕过
Destoon B2B 2014-05-21最新版绕过全局防御暴力注入(官方Demo可重现)
使用了microtime()作为随机数,可以被预测暴力破解
Android 4.4之前版本的Java加密架构(JCA)中使用的Apache Harmony 6.0M3及其之前版本的SecureRandom实现存在安全漏洞,具体位于classlib/moles/security/src/main/java/common/org/apache/harmony/security/provider/crypto/SHA1PRNG_SecureRandomImpl.java
类的engineNextBytes函数里,当用户没有提供用于产生随机数的种子时,程序不能正确调整偏移量,导致PRNG生成随机序列的过程可被预测。
Android SecureRandom漏洞详解
安全建议
上面讲的随机数基础和漏洞实例更偏重是给攻击者一些思路,这里更多的是一些防御和预防的建议。
业务场景需要使用随机数,一定要使用随机数,比如Token的生成;
随机数要足够长,避免暴力破解;
保证不同用处的随机数使用不同的种子
对安全性要求高的随机数(如密码技术相关)禁止使用的弱伪随机数:
不要使用时间函数作为随机数(很多程序员喜欢用时间戳) Java:system.currenttimemillis() php:microtime()
不要使用弱伪随机数生成器 Java: java.util.Random PHP: rand() 范围很小,32767 PHP: mt_rand() 存在缺陷
强伪随机数CSPRNG(安全可靠的伪随机数生成器(Cryptographically Secure Pseudo-Random Number Generator)的各种参考
6.强伪随机数生成(不建议开发自己实现)
产生高强度的随机数,有两个重要的因素:种子和算法。算法是可以有很多的,通常如何选择种子是非常关键的因素。 如Random,它的种子是System.currentTimeMillis(),所以它的随机数都是可预测的, 是弱伪随机数。
强伪随机数的生成思路:收集计算机的各种,键盘输入时间,内存使用状态,硬盘空闲空间,IO延时,进程数量,线程数量等信息,CPU时钟,来得到一个近似随机的种子,主要是达到不可预测性。
暂时先写到这里