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

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

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

說(shuō)透游戲中常用的兩種隨機(jī)算法

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:labuladong ? 作者:labuladong ? 2022-11-09 11:17 ? 次閱讀

沒(méi)事兒的時(shí)候我喜歡玩玩那些經(jīng)典的 2D 網(wǎng)頁(yè)小游戲,我發(fā)現(xiàn)很多游戲都要涉及地圖的隨機(jī)生成,比如掃雷游戲中地雷的位置應(yīng)該是隨機(jī)分布的:

e7b652ca-5fdc-11ed-8abf-dac502259ad0.jpg

再比如經(jīng)典炸彈人游戲,障礙物的位置也是有一定隨機(jī)性的:

e7d12dac-5fdc-11ed-8abf-dac502259ad0.jpg

這些 2D 游戲相較現(xiàn)在的大型 3D 游戲雖然看起來(lái)有些簡(jiǎn)陋,但依然用到很多有趣算法技巧,本文就來(lái)深入研究一下地圖的隨機(jī)生成算法。

2D 游戲的地圖肯定可以抽象成一個(gè)二維矩陣,就拿掃雷舉例吧,我們可以用下面這個(gè)類表示掃雷的棋盤:

classGame{
intm,n;
//大小為m*n的二維棋盤
//值為true的地方代表有雷,false代表沒(méi)有雷
boolean[][]board;
}

如果你想在棋盤中隨機(jī)生成k個(gè)地雷,也就是說(shuō)你需要在board中生成k個(gè)不同的(x, y)坐標(biāo),且這里面x, y都是隨機(jī)生成的。

對(duì)于這個(gè)需求,首先一個(gè)優(yōu)化就是對(duì)二維矩陣進(jìn)行「降維打擊」,把二維數(shù)組轉(zhuǎn)化成一維數(shù)組

classGame{
intm,n;
//長(zhǎng)度為m*n的一維棋盤
//值為true的地方代表有雷,false代表沒(méi)有雷
boolean[]board;

//將二維數(shù)組中的坐標(biāo)(x,y)轉(zhuǎn)化為一維數(shù)組中的索引
intencode(intx,inty){
returnx*n+y;
}

//將一維數(shù)組中的索引轉(zhuǎn)化為二維數(shù)組中的坐標(biāo)(x,y)
int[]decode(intindex){
returnnewint[]{index/n,index%n};
}
}

這樣,我們只要在[0, m * n)中選取一個(gè)隨機(jī)數(shù),就相當(dāng)于在二維數(shù)組中隨機(jī)選取了一個(gè)元素。

但問(wèn)題是,我們現(xiàn)在需要隨機(jī)選出k個(gè)不同的位置放地雷。你可能說(shuō),那在[0, m * n)中選出來(lái)k個(gè)隨機(jī)數(shù)不就行了?

是的,但實(shí)際操作起來(lái)有些麻煩,因?yàn)槟愫茈y保證隨機(jī)數(shù)不重復(fù)。如果出現(xiàn)重復(fù)的隨機(jī)數(shù),你就得再隨機(jī)選一次,直到找到k個(gè)不同的隨機(jī)數(shù)。

如果k比較小m * n比較大,那出現(xiàn)重復(fù)隨機(jī)數(shù)的概率還比較低,但如果km * n的大小接近,那么出現(xiàn)重復(fù)隨機(jī)數(shù)的概率非常高,算法的效率就會(huì)大幅下降。

那么,我們有沒(méi)有更好的辦法能夠在線性的時(shí)間復(fù)雜度解決這個(gè)問(wèn)題?其實(shí)是有的,而且有很多種解決方案。

洗牌算法

第一個(gè)解決方案,我們可以換個(gè)思路,避開(kāi)「在數(shù)組中隨機(jī)選擇k個(gè)元素」這個(gè)問(wèn)題,把問(wèn)題轉(zhuǎn)化成「如何隨機(jī)打亂一個(gè)數(shù)組」

現(xiàn)在想隨機(jī)初始化k顆地雷的位置,你可以先把這k顆地雷放在board開(kāi)頭,然后把board數(shù)組隨機(jī)打亂,這樣地雷不就隨機(jī)分布到board數(shù)組的各個(gè)地方了嗎?

洗牌算法,或者叫隨機(jī)亂置算法就是專門解決這個(gè)問(wèn)題的,我們可以看下力扣第 384 題「打亂數(shù)組」:

e7eee2fc-5fdc-11ed-8abf-dac502259ad0.jpg

這個(gè)shuffle函數(shù)是算法的關(guān)鍵,直接看解法代碼吧:

classSolution{
privateint[]nums;
privateRandomrand=newRandom();

publicSolution(int[]nums){
this.nums=nums;
}

publicint[]reset(){
returnnums;
}

//洗牌算法
publicint[]shuffle(){
intn=nums.length;
int[]copy=Arrays.copyOf(nums,n);
for(inti=0;i//生成一個(gè)[i,n-1]區(qū)間內(nèi)的隨機(jī)數(shù)
intr=i+rand.nextInt(n-i);
//交換nums[i]和nums[r]
swap(copy,i,r);
}
returncopy;
}

privatevoidswap(int[]nums,inti,intj){
inttemp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}

洗牌算法的時(shí)間復(fù)雜度是 O(N),而且邏輯很簡(jiǎn)單,關(guān)鍵在于讓你證明為什么這樣做是正確的。排序算法的結(jié)果是唯一可以很容易檢驗(yàn)的,但隨機(jī)亂置算法不一樣,亂可以有很多種,你怎么能證明你的算法是「真的亂」呢?

分析洗牌算法正確性的準(zhǔn)則:產(chǎn)生的結(jié)果必須有n!種可能。這個(gè)很好解釋,因?yàn)橐粋€(gè)長(zhǎng)度為n的數(shù)組的全排列就有n!種,也就是說(shuō)打亂結(jié)果總共有n!種。算法必須能夠反映這個(gè)事實(shí),才是正確的。

有了這個(gè)原則再看代碼應(yīng)該就容易理解了:

對(duì)于nums[0],我們把它隨機(jī)換到了索引[0, n)上,共有n種可能性;

對(duì)于nums[1],我們把它隨機(jī)換到了索引[1, n)上,共有n - 1種可能性;

對(duì)于nums[2],我們把它隨機(jī)換到了索引[2, n)上,共有n - 2種可能性;

以此類推,該算法可以生成n!種可能的結(jié)果,所以這個(gè)算法是正確的,能夠保證隨機(jī)性。

水塘抽樣算法

學(xué)會(huì)了洗牌算法,掃雷游戲的地雷隨機(jī)初始化問(wèn)題就解決了。不過(guò)別忘了,洗牌算法只是一個(gè)取巧方案,我們還是得面對(duì)「在若干元素中隨機(jī)選擇k個(gè)元素」這個(gè)終極問(wèn)題。

要知道洗牌算法能夠生效的前提是你使用數(shù)組這種數(shù)據(jù)結(jié)構(gòu),如果讓你在一條鏈表中隨機(jī)選擇k個(gè)元素,肯定不能再用洗牌算法來(lái)蒙混過(guò)關(guān)了。

再比如,假設(shè)我們的掃雷游戲中棋盤的長(zhǎng)和寬非常大,已經(jīng)不能在內(nèi)存中裝下一個(gè)大小為m * nboard數(shù)組了,我們只能維護(hù)一個(gè)大小為k的數(shù)組記錄地雷的位置:

classGame{
//棋盤的行數(shù)和列數(shù)(非常大)
intm,n;
//長(zhǎng)度為k的數(shù)組,記錄k個(gè)地雷的一維索引
int[]mines;

//將二維數(shù)組中的坐標(biāo)(x,y)轉(zhuǎn)化為一維數(shù)組中的索引
intencode(intx,inty){
returnx*n+y;
}

//將一維數(shù)組中的索引轉(zhuǎn)化為二維數(shù)組中的坐標(biāo)(x,y)
int[]decode(intindex){
returnnewint[]{index/n,index%n};
}
}

這樣的話,我們必須想辦法在[0, m*n)中隨機(jī)選取k個(gè)不同的數(shù)字了。

這就是常見(jiàn)的隨機(jī)抽樣場(chǎng)景,常用的解法是水塘抽樣算法(Reservoir Sampling)。水塘抽樣算法是一種隨機(jī)概率算法,會(huì)者不難,難者不會(huì)。

我第一次見(jiàn)到這個(gè)算法問(wèn)題是谷歌的一道算法題:給你一個(gè)未知長(zhǎng)度的單鏈表,請(qǐng)你設(shè)計(jì)一個(gè)算法,只能遍歷一次,隨機(jī)地返回鏈表中的一個(gè)節(jié)點(diǎn)。

這里說(shuō)的隨機(jī)是均勻隨機(jī)(uniform random),也就是說(shuō),如果有n個(gè)元素,每個(gè)元素被選中的概率都是1/n,不可以有統(tǒng)計(jì)意義上的偏差。

一般的想法就是,我先遍歷一遍鏈表,得到鏈表的總長(zhǎng)度n,再生成一個(gè)[0,n-1)之間的隨機(jī)數(shù)為索引,然后找到索引對(duì)應(yīng)的節(jié)點(diǎn)。但這不符合只能遍歷一次鏈表的要求。

這個(gè)問(wèn)題的難點(diǎn)在于隨機(jī)選擇是「動(dòng)態(tài)」的,比如說(shuō)你現(xiàn)在你已經(jīng)遍歷了 5 個(gè)元素,你已經(jīng)隨機(jī)選取了其中的某個(gè)元素a作為結(jié)果,但是現(xiàn)在再給你一個(gè)新元素b,你應(yīng)該留著a還是將b作為結(jié)果呢?以什么邏輯做出的選擇,才能保證你的選擇方法在概率上是公平的呢?

先說(shuō)結(jié)論,當(dāng)你遇到第i個(gè)元素時(shí),應(yīng)該有1/i的概率選擇該元素,1 - 1/i的概率保持原有的選擇。看代碼容易理解這個(gè)思路:

/*返回鏈表中一個(gè)隨機(jī)節(jié)點(diǎn)的值*/
intgetRandom(ListNodehead){
Randomr=newRandom();
inti=0,res=0;
ListNodep=head;
//while循環(huán)遍歷鏈表
while(p!=null){
i++;
//生成一個(gè)[0,i)之間的整數(shù)
//這個(gè)整數(shù)等于0的概率就是1/i
if(0==r.nextInt(i)){
res=p.val;
}
p=p.next;
}
returnres;
}

對(duì)于概率算法,代碼往往都是很淺顯的,但是這種問(wèn)題的關(guān)鍵在于證明,你的算法為什么是對(duì)的?為什么每次以1/i的概率更新結(jié)果就可以保證結(jié)果是平均隨機(jī)的?

我們來(lái)證明一下,假設(shè)總共有n個(gè)元素,我們要的隨機(jī)性無(wú)非就是每個(gè)元素被選擇的概率都是1/n對(duì)吧,那么對(duì)于第i個(gè)元素,它被選擇的概率就是:

e80b8b14-5fdc-11ed-8abf-dac502259ad0.png

i個(gè)元素被選擇的概率是1/i,在第i+1次不被替換的概率是1 - 1/(i+1),在第i+2次不被替換的概率是1 - 1/(i+2),以此類推,相乘的結(jié)果是第i個(gè)元素最終被選中的概率,也就是1/n。因此,該算法的邏輯是正確的。

同理,如果要在單鏈表中隨機(jī)選擇k個(gè)數(shù),只要在第i個(gè)元素處以k/i的概率選擇該元素,以1 - k/i的概率保持原有選擇即可。代碼如下:

/*返回鏈表中k個(gè)隨機(jī)節(jié)點(diǎn)的值*/
int[]getRandom(ListNodehead,intk){
Randomr=newRandom();
int[]res=newint[k];
ListNodep=head;

//前k個(gè)元素先默認(rèn)選上
for(inti=0;inull;i++){
res[i]=p.val;
p=p.next;
}

inti=k;
//while循環(huán)遍歷鏈表
while(p!=null){
i++;
//生成一個(gè)[0,i)之間的整數(shù)
intj=r.nextInt(i);
//這個(gè)整數(shù)小于k的概率就是k/i
if(jreturnres;
}

對(duì)于數(shù)學(xué)證明,和上面區(qū)別不大:

e81eac12-5fdc-11ed-8abf-dac502259ad0.png

雖然每次更新選擇的概率增大了k倍,但是選到具體第i個(gè)元素的概率還是要乘1/k,也就回到了上一個(gè)推導(dǎo)。

類似的,回到掃雷游戲的隨機(jī)初始化問(wèn)題,我們可以寫一個(gè)這樣的sample抽樣函數(shù):

//在區(qū)間[lo,hi)中隨機(jī)抽取k個(gè)數(shù)字
int[]sample(intlo,inthi,intk){
Randomr=newRandom();
int[]res=newint[k];

//前k個(gè)元素先默認(rèn)選上
for(inti=0;iinti=k;
//while循環(huán)遍歷數(shù)字區(qū)間
while(i//生成一個(gè)[0,i)之間的整數(shù)
intj=r.nextInt(i);
//這個(gè)整數(shù)小于k的概率就是k/i
if(j1;
}
}
returnres;
}

這個(gè)函數(shù)能夠在一定的區(qū)間內(nèi)隨機(jī)選擇k個(gè)數(shù)字,確保抽樣結(jié)果是均勻隨機(jī)的且只需要 O(N) 的時(shí)間復(fù)雜度。

蒙特卡洛驗(yàn)證法

上面講到的洗牌算法和水塘抽樣算法都屬于隨機(jī)概率算法,雖然從數(shù)學(xué)上推導(dǎo)上可以證明算法的思路是正確的,但如果你筆誤寫出 bug,就會(huì)導(dǎo)致概率上的不均等。更神奇的是,力扣的判題機(jī)制能夠檢測(cè)出這種概率錯(cuò)誤。

那么最后我就來(lái)介紹一種方法檢測(cè)隨機(jī)算法的正確性:蒙特卡洛方法。我猜測(cè)力扣的判題系統(tǒng)也是利用這個(gè)方法來(lái)判斷隨機(jī)算法的正確性的。

記得高中有道數(shù)學(xué)題:往一個(gè)正方形里面隨機(jī)打點(diǎn),這個(gè)正方形里緊貼著一個(gè)圓,告訴你打點(diǎn)的總數(shù)和落在圓里的點(diǎn)的數(shù)量,讓你計(jì)算圓周率。

e8484e00-5fdc-11ed-8abf-dac502259ad0.png

這其實(shí)就是利用了蒙特卡羅方法:當(dāng)打的點(diǎn)足夠多的時(shí)候,點(diǎn)的數(shù)量就可以近似代表圖形的面積。結(jié)合面積公式,可以很容易通過(guò)正方形和圓中點(diǎn)的數(shù)量比值推出圓周率的。

當(dāng)然,打的點(diǎn)越多,算出的圓周率越準(zhǔn)確,充分體現(xiàn)了大力出奇跡的道理。

比如,我們可以這樣檢驗(yàn)水塘抽樣算法sample函數(shù)的正確性:

publicstaticvoidmain(String[]args){
//在[12,22)中隨機(jī)選3個(gè)數(shù)
intlo=12,hi=22,k=3;
//記錄每個(gè)元素被選中的次數(shù)
int[]count=newint[hi-lo];
//重復(fù)10萬(wàn)次
intN=1000000;
for(inti=0;iint[]res=sample(lo,hi,k);
for(intelem:res){
//對(duì)隨機(jī)選取的元素進(jìn)行記錄
count[elem-lo]++;
}
}
System.out.println(Arrays.toString(count));
}

這段代碼的輸出如下:

[300821,299598,299792,299198,299510,300789,300022,300326,299362,300582]

當(dāng)然你可以做更細(xì)致的檢查,不過(guò)粗略看看,各個(gè)元素被選中的次數(shù)大致是相同的,這個(gè)算法實(shí)現(xiàn)的應(yīng)該沒(méi)啥問(wèn)題。

對(duì)于洗牌算法中的shuffle函數(shù)也可以采取類似的驗(yàn)證方法,我們可以跟蹤某一個(gè)元素x被打亂后的索引位置,如果x落在各個(gè)索引的次數(shù)基本相同,則說(shuō)明算法正確,你可以自己嘗試實(shí)現(xiàn),我就不貼代碼驗(yàn)證了。

拓展延伸

到這里,常見(jiàn)的隨機(jī)算法就講完了,簡(jiǎn)單總結(jié)下吧。

洗牌算法主要用于打亂數(shù)組,比如我們?cè)?/span>快速排序詳解及運(yùn)用中就用到了洗牌算法保證快速排序的效率。

水塘抽樣算法的運(yùn)用更加廣泛,可以在序列中隨機(jī)選擇若干元素,且能保證每個(gè)元素被選中的概率均等。

對(duì)于這些隨機(jī)概率算法,我們可以用蒙特卡洛方法檢驗(yàn)其正確性。

最后留幾個(gè)拓展題目:

1、本文開(kāi)頭講到了將二維數(shù)組坐標(biāo)(x, y)轉(zhuǎn)化成一維數(shù)組索引的技巧,那么你是否有辦法把三維坐標(biāo)(x, y, z)轉(zhuǎn)化成一維數(shù)組的索引呢?

2、如何對(duì)帶有權(quán)重的樣本進(jìn)行加權(quán)隨機(jī)抽?。勘热缃o你一個(gè)數(shù)組w,每個(gè)元素w[i]代表權(quán)重,請(qǐng)你寫一個(gè)算法,按照權(quán)重隨機(jī)抽取索引。比如w = [1,99],算法抽到索引 0 的概率是 1%,抽到索引 1 的概率是 99%,答案見(jiàn)我的這篇文章。

3、實(shí)現(xiàn)一個(gè)生成器類,構(gòu)造函數(shù)傳入一個(gè)很長(zhǎng)的數(shù)組,請(qǐng)你實(shí)現(xiàn)randomGet方法,每次調(diào)用隨機(jī)返回?cái)?shù)組中的一個(gè)元素,多次調(diào)用不能重復(fù)返回相同索引的元素。要求不能對(duì)該數(shù)組進(jìn)行任何形式的修改,且操作的時(shí)間復(fù)雜度是 O(1),答案見(jiàn)我的這篇文章

審核編輯 :李倩


聲明:本文內(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

    文章

    4552

    瀏覽量

    92020
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    313

    瀏覽量

    20842
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    411

    瀏覽量

    25821

原文標(biāo)題:說(shuō)透游戲中常用的兩種隨機(jī)算法

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    晶閘管的阻斷狀態(tài)有兩種是什么

    晶閘管(Thyristor)是一半導(dǎo)體器件,具有單向?qū)щ娦裕瑥V泛應(yīng)用于電力電子領(lǐng)域。晶閘管的阻斷狀態(tài)有兩種:正向阻斷狀態(tài)和反向阻斷狀態(tài)。以下是對(duì)這兩種阻斷狀態(tài)的分析。 正向阻斷狀態(tài) 正向阻斷狀態(tài)
    的頭像 發(fā)表于 08-14 16:49 ?257次閱讀

    PCBA加工中常見(jiàn)的兩種焊接方式詳解

    ,在PCBA行業(yè)中經(jīng)常被使用。接下來(lái)深圳PCBA加工廠家為大家詳細(xì)介紹PCBA加工手工焊接的兩種方式,為您揭秘行業(yè)內(nèi)的技術(shù)細(xì)節(jié)。 PCBA加工過(guò)程中常用焊接方式 第一方式是傳統(tǒng)手工焊接。這種方式主要依靠技術(shù)工人的手動(dòng)操作進(jìn)行焊
    的頭像 發(fā)表于 06-14 09:18 ?345次閱讀

    輕松搞懂傳和非傳的區(qū)別

    傳和非傳是數(shù)據(jù)通信中的兩種不同模式,各自有其適用場(chǎng)景和優(yōu)勢(shì)。傳模式簡(jiǎn)單、高效,適用于數(shù)據(jù)完整性要求高的場(chǎng)景;非傳模式則通過(guò)數(shù)據(jù)處理提
    的頭像 發(fā)表于 06-05 12:03 ?5583次閱讀
    輕松搞懂<b class='flag-5'>透</b>傳和非<b class='flag-5'>透</b>傳的區(qū)別

    Xbox應(yīng)用新增“游戲中心”功能

    微軟 Xbox 體驗(yàn)高級(jí)產(chǎn)品經(jīng)理 Dylan Meade表示,“游戲中心”便于玩家追蹤游戲進(jìn)展,發(fā)現(xiàn)游戲最新內(nèi)容和擴(kuò)展包,與友人聯(lián)機(jī)競(jìng)技,接收開(kāi)發(fā)商的最新新聞等。
    的頭像 發(fā)表于 02-27 14:02 ?503次閱讀

    gis中常用的空間分析方法

    GIS中常用的空間分析方法 GIS(地理信息系統(tǒng))是一用于收集、存儲(chǔ)、處理、分析和展示地理數(shù)據(jù)的技術(shù)??臻g分析是GIS的核心部分,它包括一系列方法和技術(shù),用來(lái)研究地理空間數(shù)據(jù)之間的關(guān)系和模式。本文
    的頭像 發(fā)表于 02-25 13:44 ?4005次閱讀

    雙絞線接法的標(biāo)準(zhǔn)有哪兩種 雙絞線使用什么端接頭

    雙絞線是一常用的網(wǎng)絡(luò)傳輸介質(zhì),其接法標(biāo)準(zhǔn)有兩種:直通接法和交叉接法。雙絞線通常使用RJ45接頭。 第一雙絞線接法標(biāo)準(zhǔn)是直通接法,也稱為直通連接。該連接方式使用相同的引腳對(duì)線纜的
    的頭像 發(fā)表于 02-03 11:11 ?3171次閱讀

    半導(dǎo)體存儲(chǔ)器有哪些 半導(dǎo)體存儲(chǔ)器分為哪兩種

    半導(dǎo)體存儲(chǔ)器(Semiconductor Memory)是一電子元件,用于存儲(chǔ)和檢索數(shù)據(jù)。它由半導(dǎo)體材料制成,采用了半導(dǎo)體技術(shù),是計(jì)算機(jī)和電子設(shè)備中最常用的存儲(chǔ)器。 半導(dǎo)體存儲(chǔ)器可以分為兩種
    的頭像 發(fā)表于 02-01 17:19 ?2365次閱讀

    想知道淮安摜蛋游戲中的RFID技術(shù)有什么作用嗎?

    在淮安,有一深受群眾喜愛(ài)的撲克游戲,名為摜蛋。它是一融合了升級(jí)、跑得快等多種玩法的撲克游戲,具有極高的趣味性和競(jìng)技性。近年來(lái),隨著科技的不斷發(fā)展,RFID技術(shù)也開(kāi)始在淮安摜蛋
    的頭像 發(fā)表于 01-26 17:01 ?469次閱讀

    VCXO和TCXO:兩種常用的晶體振蕩器,你了解它們的原理和應(yīng)用嗎?

    VCXO和TCXO:兩種常用的晶體振蕩器,你了解它們的原理和應(yīng)用嗎?
    的頭像 發(fā)表于 12-06 14:55 ?1380次閱讀
    VCXO和TCXO:<b class='flag-5'>兩種</b><b class='flag-5'>常用</b>的晶體振蕩器,你了解它們的原理和應(yīng)用嗎?

    兩種常見(jiàn)EMC整改流程!

    兩種常見(jiàn)EMC整改流程!|深圳比創(chuàng)達(dá)電子EMC
    的頭像 發(fā)表于 11-23 10:10 ?836次閱讀

    如何使用Python在游戲中實(shí)現(xiàn)延時(shí)攝影

    游戲中的畫面,尤其是希望能拍攝到游戲內(nèi)不同時(shí)刻的畫面,為了滿足這個(gè)需求,我們就需要用上延時(shí)攝影。游戲內(nèi)的時(shí)間過(guò)得比現(xiàn)實(shí)世界更快,一個(gè)小時(shí)內(nèi)可能你就能經(jīng)歷白天的夜晚的變化,這也為延時(shí)攝影提供了很好的環(huán)境。 那么究
    的頭像 發(fā)表于 10-30 09:52 ?377次閱讀

    常見(jiàn)的ARM架構(gòu)分為兩種是M系列另外一是A系列,這兩種有什么區(qū)別???

    現(xiàn)在市面上常見(jiàn)的ARM架構(gòu)分為兩種是M系列另外一是A系列,這兩種有什么區(qū)別啊,用的時(shí)候他們一般分別用在什么地方啊。
    發(fā)表于 10-26 07:00

    功率電感器存在兩種額定電流的原因

    功率電感器存在兩種額定電流的原因? 功率電感器是電力系統(tǒng)中常見(jiàn)的一電器元件,常用于一些需要過(guò)濾、調(diào)節(jié)電流、穩(wěn)定電壓等電路中。功率電感器一般分為兩種
    的頭像 發(fā)表于 10-25 11:39 ?510次閱讀

    機(jī)器人技術(shù)中常用的路徑規(guī)劃算法的開(kāi)源庫(kù)

    如何規(guī)劃?rùn)C(jī)器人的運(yùn)動(dòng)方式是機(jī)器人開(kāi)發(fā)領(lǐng)域的一大課題,本文分享GitHub的一個(gè)機(jī)器人技術(shù)中常用的路徑規(guī)劃算法的開(kāi)源庫(kù),并用動(dòng)圖直觀演示運(yùn)行過(guò)程。其中大部分代碼由Python實(shí)現(xiàn)。
    的頭像 發(fā)表于 10-21 09:36 ?853次閱讀
    機(jī)器人技術(shù)<b class='flag-5'>中常用</b>的路徑規(guī)劃<b class='flag-5'>算法</b>的開(kāi)源庫(kù)

    理解STM32控制中常見(jiàn)的PID算法

    理解STM32控制中常見(jiàn)的PID算法
    的頭像 發(fā)表于 10-17 17:28 ?2102次閱讀
    理解STM32控制<b class='flag-5'>中常</b>見(jiàn)的PID<b class='flag-5'>算法</b>