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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

淺析Knuth高效洗牌算法

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:ACM算法日常 ? 作者:ACM算法日常 ? 2021-04-26 15:41 ? 次閱讀

今天在做一個(gè)游戲需求的時(shí)候碰到一個(gè)問(wèn)題,問(wèn)題很簡(jiǎn)單,給定75個(gè)球,編號(hào)1-75,需要保證初始化的時(shí)候位置是隨機(jī)的。

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

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

arr := rand.Perm(75)

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

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

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

實(shí)現(xiàn)很簡(jiǎn)單,然而初一看有點(diǎn)懵,因?yàn)闆](méi)有用到shuffle,而是一次遍歷就把事情給解決了,到底是怎么回事?

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

頓時(shí)覺(jué)得golang很NB,確實(shí)很高效。

上面這段代碼寫了4行的注釋,大概意思是說(shuō)不能省去0那一次,看起來(lái)沒(méi)啥用處,但是為了照顧r隨機(jī)器中的隨機(jī)序列,還是要加上,不然可能會(huì)造成負(fù)作用,這里面和隨機(jī)種子以及此后隨機(jī)的序列有關(guān),為了對(duì)隨機(jī)序列不產(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] 之間的隨機(jī)整數(shù)

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

看似簡(jiǎn)單的問(wèn)題,竟然又扯出Knuth,大意了。

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

最后以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)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4588

    瀏覽量

    92511
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4723

    瀏覽量

    68242
  • Shuffle
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    1674

原文標(biāo)題:Knuth高效洗牌算法

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

    QC快充芯片,因高效而兼容性好而成為手機(jī)標(biāo)配的充電解決方案!

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

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

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

    充電也要算法??jī)?chǔ)能充電芯片中的算法處理器

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

    BLDC電機(jī)控制算法詳解

    無(wú)刷直流電機(jī)(Brushless DC Motor,簡(jiǎn)稱BLDC電機(jī))以其高效率、高可靠性和低噪音等特點(diǎn),在工業(yè)、家電和汽車等領(lǐng)域得到了廣泛應(yīng)用。為了實(shí)現(xiàn)BLDC電機(jī)的精確控制,需要采用適當(dāng)?shù)目刂?/div>
    的頭像 發(fā)表于 06-14 10:49 ?827次閱讀

    常用的電機(jī)控制算法有哪些

    在電機(jī)控制領(lǐng)域,選擇合適的控制算法對(duì)于實(shí)現(xiàn)高效、精確且穩(wěn)定的電機(jī)運(yùn)行至關(guān)重要。以下將詳細(xì)介紹幾種常用的電機(jī)控制算法,并通過(guò)具體的分析和實(shí)例,探討它們的特點(diǎn)、應(yīng)用以及優(yōu)勢(shì)。
    的頭像 發(fā)表于 06-05 16:31 ?1995次閱讀

    淺析FreeRTOS任務(wù)調(diào)度器的三種調(diào)度算法和應(yīng)用

    FreeRTOS在MCU領(lǐng)域應(yīng)用非常廣泛,今天就給大家講解一下FreeRTOS調(diào)度器中的三種調(diào)度算法,以及在瑞薩RZ/T2L MPU中的應(yīng)用。
    的頭像 發(fā)表于 05-10 14:02 ?6389次閱讀
    <b class='flag-5'>淺析</b>FreeRTOS任務(wù)調(diào)度器的三種調(diào)度<b class='flag-5'>算法</b>和應(yīng)用

    淺析基于水廠云平臺(tái)的用電設(shè)備高效運(yùn)行管理系統(tǒng)

    程瑜 安科瑞電氣股份有限公司?上海嘉定 201801 【摘要】:為監(jiān)測(cè)大型用電設(shè)備的電能消耗情況,實(shí)現(xiàn)安全用電和設(shè)備的高效管理,本課題建立了一個(gè)基于云平臺(tái)大數(shù)據(jù)智能化運(yùn)維的用電設(shè)備安全高效運(yùn)行
    的頭像 發(fā)表于 03-01 10:29 ?402次閱讀
    <b class='flag-5'>淺析</b>基于水廠云平臺(tái)的用電設(shè)備<b class='flag-5'>高效</b>運(yùn)行管理系統(tǒng)

    淺析配電能源管理系統(tǒng)在鋼鐵行業(yè)的應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《淺析配電能源管理系統(tǒng)在鋼鐵行業(yè)的應(yīng)用.docx》資料免費(fèi)下載
    發(fā)表于 01-11 16:15 ?0次下載

    浮點(diǎn)LMS算法的FPGA實(shí)現(xiàn)

    運(yùn)算的運(yùn)算步驟遠(yuǎn)比定點(diǎn)運(yùn)算繁瑣,運(yùn)算速度慢且所需硬件資源大大增加,因此基于浮點(diǎn)運(yùn)算的LMS算法的硬件實(shí)現(xiàn)一直以來(lái)是學(xué)者們研究的難點(diǎn)和熱點(diǎn)。 本文正是基于這種高效結(jié)構(gòu)的多輸入FPA,在FPGA上成功實(shí)現(xiàn)了基于浮點(diǎn)運(yùn)算的LMS算法。
    的頭像 發(fā)表于 12-21 16:40 ?700次閱讀

    保護(hù)器件過(guò)電應(yīng)力失效機(jī)理和失效現(xiàn)象淺析

    保護(hù)器件過(guò)電應(yīng)力失效機(jī)理和失效現(xiàn)象淺析
    的頭像 發(fā)表于 12-14 17:06 ?720次閱讀
    保護(hù)器件過(guò)電應(yīng)力失效機(jī)理和失效現(xiàn)象<b class='flag-5'>淺析</b>

    淺析工業(yè)低功耗紅外氣體濃度傳感器和常規(guī)鎢絲燈氣體濃度傳感器的工作原理及其區(qū)別

    淺析工業(yè)低功耗紅外氣體濃度傳感器和常規(guī)鎢絲燈氣體濃度傳感器的工作原理及其區(qū)別
    的頭像 發(fā)表于 12-13 10:53 ?646次閱讀
    <b class='flag-5'>淺析</b>工業(yè)低功耗紅外氣體濃度傳感器和常規(guī)鎢絲燈氣體濃度傳感器的工作原理及其區(qū)別

    陶瓷電容溫度系數(shù)淺析:1類和2類電容有何差異?如何標(biāo)識(shí)?

    陶瓷電容溫度系數(shù)淺析:1類和2類電容有何差異?如何標(biāo)識(shí)?
    的頭像 發(fā)表于 12-08 17:30 ?1142次閱讀
    陶瓷電容溫度系數(shù)<b class='flag-5'>淺析</b>:1類和2類電容有何差異?如何標(biāo)識(shí)?

    電子電路板中的穩(wěn)態(tài)與瞬態(tài)熱傳遞淺析

    電子電路板中的穩(wěn)態(tài)與瞬態(tài)熱傳遞淺析
    的頭像 發(fā)表于 12-05 17:20 ?1457次閱讀
    電子電路板中的穩(wěn)態(tài)與瞬態(tài)熱傳遞<b class='flag-5'>淺析</b>