❶ 想用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時鍾,來得到一個近似隨機的種子,主要是達到不可預測性。
暫時先寫到這里