一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

淺析Knuth高效洗牌算法

算法與數(shù)據(jù)結(jié)構 ? 來源:ACM算法日常 ? 作者:ACM算法日常 ? 2021-04-26 15:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天在做一個游戲需求的時候碰到一個問題,問題很簡單,給定75個球,編號1-75,需要保證初始化的時候位置是隨機的。

顯然,我們可以初始化一個數(shù)組A,把75個數(shù)放進去,然后做一個shuffle函數(shù)隨機交換其中的元素,這樣就是隨機的。

我準備這樣做一個shuffle,但同時也想看看golang里面是否有這樣的接口直接得到結(jié)果,看了下還真有,這個函數(shù)是rand.Perm(n),這個函數(shù)會返回一個數(shù)組,比如我傳入75,會返回一個0-74的隨機數(shù)組。

arr := rand.Perm(75)

好奇心驅(qū)使我一探究竟,golang會用什么樣的方式實現(xiàn)Perm函數(shù)呢?

打開golang的源代碼,在rand.go文件中找到這個函數(shù):

8722762c-a4b3-11eb-aece-12bb97331649.png

實現(xiàn)很簡單,然而初一看有點懵,因為沒有用到shuffle,而是一次遍歷就把事情給解決了,到底是怎么回事?

仔細分析發(fā)現(xiàn),這個算法非常精巧,每次遍歷都是將當前的數(shù)i和已經(jīng)在數(shù)組中的隨機一個數(shù)m[j]進行交換,最終達到了公平隨機整個數(shù)組的作用。雖然只有短短3行代碼,卻讓人有種震撼的感覺。

頓時覺得golang很NB,確實很高效。

上面這段代碼寫了4行的注釋,大概意思是說不能省去0那一次,看起來沒啥用處,但是為了照顧r隨機器中的隨機序列,還是要加上,不然可能會造成負作用,這里面和隨機種子以及此后隨機的序列有關,為了對隨機序列不產(chǎn)生影響保證公平性,不能省略0。

網(wǎng)上搜索了一下高效洗牌算法,又發(fā)現(xiàn)python里面也有這樣的函數(shù),這樣寫的:

for(int i = N - 1; i 》= 0 ; i -- )

swap(arr[i], arr[rand(0, i)]) // rand(0, i) 生成 [0, i] 之間的隨機整數(shù)

而這個算法的出處竟然來自于TAOCP!算法就是大名鼎鼎的 Knuth-Shuffle,即 Knuth 洗牌算法。

看似簡單的問題,竟然又扯出Knuth,大意了。

能把一件小事情做到極致的人,可以稱之為藝術家。Knuth名副其實。

最后以Knuth的一句話共勉:

A programmer who subconsciously views himself as an artist will enjoy what he does and will do it better.

Donald E. Knuth 1978
編輯:lyn

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4710

    瀏覽量

    95390
  • 代碼
    +關注

    關注

    30

    文章

    4900

    瀏覽量

    70739
  • Shuffle
    +關注

    關注

    0

    文章

    5

    瀏覽量

    1821

原文標題:Knuth高效洗牌算法

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【HarmonyOS next】ArkUI-X休閑益智猜字謎【基礎】

    ) { // 類似題目隨機算法 } 通過Fisher-Yates洗牌算法實現(xiàn)高效隨機,避免題目重復。 3. 跨端UI構建 build() { Column() { // 得分&am
    發(fā)表于 06-26 20:01

    同步電機失步淺析

    純分享帖,需要者可點擊附件免費獲取完整資料~~~*附件:同步電機失步淺析.pdf【免責聲明】本文系網(wǎng)絡轉(zhuǎn)載,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請第一時間告知,刪除內(nèi)容!
    發(fā)表于 06-20 17:42

    首獲CCC認證,千億充電樁市場加速洗牌

    誰能在洗牌中握緊入場券,將成為下半場競爭的關鍵懸念。
    的頭像 發(fā)表于 05-30 17:15 ?318次閱讀

    PID控制算法的C語言實現(xiàn):PID算法原理

    在工業(yè)應用中 PID 及其衍生算法是應用最廣泛的算法之一,是當之無愧的萬能算法,如果能夠熟練掌握 PID 算法的設計與實現(xiàn)過程,對于一般的研發(fā)人員來講,應該是足夠應對一般研發(fā)問題了,而
    發(fā)表于 02-26 15:24

    直擊 MBR2054:低正向壓降如何成就高效電路,應用實例解讀#

    高效電路
    杰克船長6262
    發(fā)布于 :2025年02月22日 14:23:54

    設備智能巡檢系統(tǒng),高效精準定位設備隱患

    隨著工業(yè)設備規(guī)模不斷擴大、復雜度持續(xù)提升,傳統(tǒng)人工巡檢模式已難以滿足高效、精準的隱患管理需求。中設智控推出的智能巡檢系統(tǒng),通過物聯(lián)網(wǎng)、AI算法與大數(shù)據(jù)技術,實現(xiàn)設備隱患的“主動發(fā)現(xiàn)-智能診斷-閉環(huán)處置”,助力企業(yè)構建安全高效的設
    的頭像 發(fā)表于 02-21 16:14 ?510次閱讀
    設備智能巡檢系統(tǒng),<b class='flag-5'>高效</b>精準定位設備隱患

    信道分配算法在通信中的應用

    在現(xiàn)代通信系統(tǒng)中,信道分配算法是確保有效、高效通信的關鍵技術之一。隨著移動通信技術的快速發(fā)展,用戶數(shù)量的增加和數(shù)據(jù)流量的爆炸式增長,對信道資源的需求也在不斷上升。 信道分配算法的基本概念 信道分配
    的頭像 發(fā)表于 01-22 16:22 ?776次閱讀

    常見的加密算法有哪些?它們各自的優(yōu)勢是什么?

    在于其出色的安全性能和高效的實現(xiàn)方式,已成為目前最廣泛使用的加密算法之一。它能夠抵御暴力破解攻擊,且在各種硬件和軟件平臺上都能實現(xiàn)高效的加密和解密操作。 DES(Data Encryption
    的頭像 發(fā)表于 12-17 15:57 ?1012次閱讀

    【「從算法到電路—數(shù)字芯片算法的電路實現(xiàn)」閱讀體驗】+介紹基礎硬件算法模塊

    作為嵌入式開發(fā)者往往比較關注硬件和軟件的協(xié)調(diào)。本書介紹了除法器,信號發(fā)生器,濾波器,分頻器等基本算法的電路實現(xiàn),雖然都是基礎內(nèi)容,但是也是最常用到的基本模塊。 隨著逆全球化趨勢的出現(xiàn),過去的研發(fā)
    發(fā)表于 11-21 17:05

    技術科普 | 芯片設計中的LEF文件淺析

    技術科普 | 芯片設計中的LEF文件淺析
    的頭像 發(fā)表于 11-13 01:03 ?755次閱讀
    技術科普 | 芯片設計中的LEF文件<b class='flag-5'>淺析</b>

    華納云:Chord算法如何管理節(jié)點間的聯(lián)系?

    ,以確保網(wǎng)絡變化時后繼關系的正確性。 查找效率: Chord算法通過finger表和后繼指針的設計,使得查找操作的平均時間復雜度為O(log n),其中n是網(wǎng)絡中的節(jié)點數(shù)量。 通過這些機制,Chord算法能夠有效地管理節(jié)點間的聯(lián)系,并在分布式環(huán)境中提供
    發(fā)表于 11-08 16:03

    U盤存儲并聯(lián),算法交互輸出

    FreeRTOS),負責任務調(diào)度和資源管理。 使用C/C++語言編寫數(shù)據(jù)管理、算法和通信模塊,確保代碼的高效性和可靠性。 利用現(xiàn)有的庫和框架(如TensorFlow Lite Micro)來實現(xiàn)輕量級的機器
    發(fā)表于 10-28 07:36

    QC快充芯片,因高效而兼容性好而成為手機標配的充電解決方案!

    ,其核心在于一套高效的充電協(xié)議,該協(xié)議通過智能調(diào)整充電過程中的電壓和電流,實現(xiàn)了遠超傳統(tǒng)充電方式的速度。 QC快充芯片內(nèi)置了精密的電路設計和先進的算法,能夠?qū)崟r監(jiān)測電池狀態(tài),動態(tài)調(diào)整充電策略,確保既
    發(fā)表于 09-26 10:03

    無人機電力巡檢系統(tǒng)的功能淺析

    ?????? 無人機電力巡檢系統(tǒng)的功能淺析 ?????? 隨著電力行業(yè)的快速發(fā)展,電力輸電網(wǎng)絡的規(guī)模不斷擴大,如何高效、精準地巡檢電力設施,確保供電的穩(wěn)定性和安全性,成為電力企業(yè)面臨的重要挑戰(zhàn)。傳統(tǒng)
    的頭像 發(fā)表于 08-14 16:48 ?931次閱讀
    無人機電力巡檢系統(tǒng)的功能<b class='flag-5'>淺析</b>

    充電也要算法?儲能充電芯片中的算法處理器

    或充電設備中,負責實時監(jiān)控電池狀態(tài),執(zhí)行充電策略,并調(diào)整充電參數(shù),如電流和電壓。 ? 比如算法處理器可以執(zhí)行復雜的充電算法,如恒流/恒壓充電、脈沖充電、智能協(xié)商充電等,這些算法能夠根據(jù)電池的狀態(tài)調(diào)整充電參數(shù),實現(xiàn)更
    的頭像 發(fā)表于 07-30 00:07 ?4259次閱讀