請問為什么要提出這種問題呢,我作為一個普通人看來,也知道電腦病毒對社會對網絡有危害性,不提倡這種在法律邊緣地帶的發表相關內容,即使大家分享出來的都是一些小小的惡作劇性的代碼也好文件也好,始終有不好的一面。
頭條號是一個機制性的推薦,會推薦給相關興趣標簽的用戶,萬一有相關人回答并寫出了他個人所擁有電腦病毒之類的代碼或文件,這造成的后果,我們無法想象。為了讓頭條成為一個優質的平臺,我個人覺得不應出現這種問題。
有的,比如 洗牌算法:這個算法真的很牛逼很經典,而且代碼很少。
先來思考一個問題:有一個大小為 100 的數組,里面的元素是從 1 到 100 按順序排列,怎樣隨機的從里面選擇 1 個數?
最簡單的方法是利用系統的方法 ,這樣就可以拿到一個 0 到 99 的隨機數,然后去數組找對應的位置就即可。
接下來在思考一個問題: 有一個大小為100的數組,里面的元素是從 1 到 100 按順序排列,怎樣隨機的從里面選擇 50 個數?
注意數字不能重復!
注意數字不能重復!
注意數字不能重復!
如果根據上面的思路,你第一想法是:隨機 50 次不就行了?
但是,這樣做有個很明顯的 bug :數字是會重復的。
修改一下?
弄一個數組,把每一次隨機的數都放到數組里,下一次隨機就看這個數組里面有沒有這數,有的話就繼續隨機,直到這個數組里面有 50 個數字就停止。
這樣是可以的!
但,還是有個小問題,考慮一下極端情況:有一個大小為100的數組,里面的元素是從 1 到 100 按順序排列,怎樣隨機的從里面選擇 99 個數。
如果按照上面的方法操作,越往后選擇的數字跟前面已經挑選的數字重復的概率越高,這就會造成如果數組很大,選擇的數字數目也很大的話,重復次數在量級上會很大。
這個時候就需要換一個思路,如果先將數組里面的元素打亂,那么按順序選擇前 50 個不就可以了?
是的!
但我們得注意什么叫亂?
一副撲克有 54 張牌,有 54! 種排列方式。所謂的打亂指的是,你所執行的操作,應該能夠 等概率地生成 這 54! 種結果中的一種。
洗牌算法就能做到這一點。
洗牌算法Fisher–Yates shuffle 算法由 Ronald Fisher 和 Frank Yates 于 1938 年提出,在 1964 年由 Richard Durstenfeld 改編為適用于電腦編程的版本。
這個算法很牛逼卻很好理解,通俗的解釋就是:將最后一個數和前面任意 n-1 個數中的一個數進行交換,然后倒數第二個數和前面任意 n-2 個數中的一個數進行交換。。。
小程序實現代碼
在整個過程中,這個算法保證了每一個元素出現在每一個位置的概率是相等的。
這個算法真的很牛逼很經典,而且代碼很少。
新建文本文檔,復制下面的一行代碼粘貼進去:
shutdown-t1-s-c關機
然后保存,文件改名為:關機.bat(這里說明一下,名字可以任意,但是后綴名.bat不能變)
說明:
shutdown是windows自帶的關機程序。在c:\windows\system32下可以找到。
參數說明:-t設置關機時間,1表示關機時間為1秒;
-s關機的意思;-c是設置消息,后面的關機就是所設置的消息。
1.首先,創建一個文本文檔。
2.點開文本文檔,輸入代碼:Msgbox(“系統嚴重出錯!”)稍后我們點開它時,會蹦出一個對話框來。
3.點擊文件,另存為。切記,要把文件名的后綴名改成.vbs,如圖
4.確定,然后文件就變成了這樣子。
5.見證奇跡的時刻到了!現在,點開它......
6.現在,我們玩一個更高級的,在前邊加上do loop,即無限循環,永遠也關不掉。