首頁>Club>
有哪位技術大神可以解釋一下播放器裡面"隨機播放"功能是什麼原理,如何達到的隨機選擇歌曲的效果?
14
回覆列表
  • 1 # 小淇先森

    我先宣告一下,這個是摘自網路的!!!

    一種隨機播放系統及方法,對播放的媒體檔案組成的播放列表進行處理,決定該媒體檔案的播放狀態。該系統包括:第一快取器,記錄該播放列表中包含的媒體檔案數量;第二快取器,由多個位組成,該各個位分別對應於該播放列表中的一媒體檔案,標示該播放列表中各媒體檔案的當前播放狀態;選擇模組,在執行播放任務時,根據該播放列表中隨機選取一媒體檔案;分析模組,依據該第二快取器的儲存資料分析該選擇模組選取的媒體檔案的播放狀態;以及播放模組,用來在該分析模組的分析結果為該媒體檔案未播放過時,播放該媒體檔案;本發明的隨機播放系統及方法可實現播放列表中各媒體檔案在同一迴圈中,都能被播放,達到無重複隨機播放的功效。

    事實上計算機做不到真正的隨機,它提供的隨機只是基於某種特定演算法的偽隨機。現在廣泛使用的是一種稱作線性同餘的演算法,我向對於它的數學原理樓主你是不關心的,我來通俗的描述一下它的效果。 不可否認存在某一組數具有比較好的隨機性(是偽隨機),假設拿100億個隨機性資料比較好的資料放在一起,組成一個圓圈,那麼我們需要使用隨機數的時候,就"隨便"找圈上的某個位置開始一直取數,就會得到一組偽隨機數了。計算機中自然不會儲存這麼大的一個隨機圈圈的,但是可以達到同樣的效果。它的方法是這樣的,是圈圈中的前一個數經過一定演算法運算可以得到後面的數。先隨便給定一個開始值(注意這裡的“隨便”),稱為種子,那麼用某演算法對種子進行運算,得到一個結果,這個結果作為需要的隨機數輸出,同時將這個輸出作為新的種子進行運算,得到生生不息的隨機數。演算法一般是確定的,也就是說,給定了一個確定的種子,那麼以後的隨機序列也就確定下來了------在計算機中,確實也是這樣的。 前面講到一個需要注意的“隨便”,怎麼去“隨便”才能設定一個不確定的種子呢?怎麼才能從一個大圈圈上“隨便”找到一個入口呢?其實很簡單,現在廣泛使用的方法是使用系統的當前時間,這是一個時刻改變的值,程式執行時不能保證這個數的具體值,因此可以作為一個“隨便”的入口------在計算機中,常用的隨機演算法都是這樣的,使用時間做第一個種子。 “隨機”後電腦到底對檔案做了什麼?怎麼做的? 歌曲的隨機在有了一個隨機數演算法以後也就簡單了,至於隨機有無重複這就是播放器設計者的事情了,設計是允許重複,那麼就會可能有重複,不允許就沒有,這是作者自定義的。播放器是一個程式,首先它有一個列表,被認為是有序的。現在樓主在考慮怎麼用隨機打亂它,我來說一下。 如果可以有重複,那麼最簡單了,每次要播放的時候產生一個隨機數N,然後選擇列表中的第N首歌曲播放就是了。播放完了再按相同的方法重新選擇一首,無需考慮選擇到已經播放過的歌曲,因為重複是被允許的。 如果不可以重複,那麼可以產生一個不重複的隨機序列一次播放。不重複的隨機序列怎麼產生?答案是一個一個產生,然後與前面產生過的做對比,出現過的直接拋棄。我還有一個更容易接受的演算法,為每一個演算法安排一個隨機數標誌,然後按照這個標誌的大小對列表進行排序就可以了。這麼做有一個小小的瑕疵,如果需要深入研究可以和我討論。 播放器想要播放那個檔案,那麼它就可以播放那個檔案。因此隨機播放的時候不需要對檔案做任何動作,只需要吧播放器的播放列表調整一下就可以了

    轉自:http://blog.sina.com.cn/s/blog_6828803d0100iol8.html

  • 2 # 喝奶小寶寶

    其實這也不是什麼高深的技術。

    作為一個程式設計師的我來給你說說吧,這個在程式設計當中,只要編寫一個小小的程式就可完美解決。

    就好比0-9這十個數字,我們要隨機選擇一個,如果是人呢,隨便選沒問題。可是機器沒有思想啊,怎麼辦?

    初級的想法的就是讓它加2或者減3之類的,這演算法就比較粗糙了,隨機的原則就過分簡單,每次只是播放2的倍數歌曲。

    所以我們得有一個複雜的演算法,那就是一個隨機函式,這個系統已經編寫好了,我們只要呼叫即可。至於是什麼演算法,如果你有至於當程式設計師的話,可以瞭解,不然就淺嘗輒止吧。

    不然跟行如隔山,只能說它呼叫的是時間這個種子,這才有了隨機變化的可能!

  • 3 # 胡楊說

    這個實現起來很簡單,假如說我有10首歌,那麼我每次在選下首歌時產生一個0到1之間的隨機數,然後10*這個隨機數作為下一首待播放的歌。

    如果稍微複雜一點的就是隨機選擇沒選擇過的歌曲裡面的一首,那麼可以將播放後的歌曲ID移除列表的集合,然後再對剩餘的按照一步的演算法進行選擇。

    等所有歌曲播放一遍後,把已播放的都標記為未播放

  • 4 # 夜嬰81376251

    隨機數字 聽語音

    (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,將公式永久性地改為隨機數。不過,這樣只能一個一個的永久性更改,如果數字比較多,也可以全部選擇之後,另外選擇一個合適的位置貼上,貼上的方法是點選右鍵,選擇“

    選擇性貼上

    ”,然後選擇“數值”,即可將之前複製的隨機數公式產生的數值(而不是公式)複製下來。解釋#include <stdlib.h>rand()srand()標準C庫中函式rand()可以生成0~

    RAND_MAX

    之間的一個隨機數,其中RAND_MAX 是stdlib.h 中定義的一個整數,它與系統有關。rand()函式沒有輸入引數,直接透過

    表示式

    rand()來引用;例如可以用下面的語句來列印兩個隨機數:printf("Random numbers are: %i %i\n",rand(),rand());因為rand()函式是按指定的順序來產生整數,因此每次執行上面的語句都列印相同的兩個值,所以說C語言的隨機並不是真正意義上的隨機。為了使程式在每次執行時都能生成一個新序列的隨機值,我們通常透過為隨機數生成器提供一粒新的

    隨機種子

    。函式 srand()(來自stdlib.h)可以為隨機數生成器播散種子。只要種子不同rand()函式就會產生不同的隨機數序列。srand()稱為隨機數生成器的

    初始化器

    例程

    檔名: rand_srand.c

    /*Thisprogramgeneratesandprintstenrandomintegersbetween1andRAND_MAX*/ #include<stdio.h> #include<stdlib.h> intmain() { unsignedintseed;/*申明初始化器的種子,注意是usignedint型的*/ intk; printf("Enterapositiveintegerseedvalue:\n");scanf("%u",&seed); srand(seed); printf("RandomNumbersare:\n"); for(k=1;k<=10;k++) { printf("%i",rand()); printf("\n"); } return0; }

    當提供的種子相同時,隨機數序列也時相同的。而且當種子為1時,與不使用srand()函式時一樣的,也就是說rand()函式預設情況下初始化種子值為1;在stdlib.h 中這兩個函式的原型是:int rand();void srand (unsigned int);srand(time(0)); i=rand(); 這樣i就是一個真正意義上的隨機數。

    原因

    rand()產生

    偽隨機數

    ,srand函式提供種子,種子不同產生的隨機數序列也不同,所以通常先呼叫srand函式 time(0)返回的是系統的時間(從1970.1.1午夜算起),單位:秒,種子不同當然產生的隨機數相同機率就很小了。

  • 5 # yNie_vOcAtion

    真隨機就是1到10的數字,重複111111111。假隨機1到10的數字例如135792468...真隨機一般都是採用不被人為干擾的大氣噪音等係數。所以我現在如果採用大自然中風的風速,來做隨機數的話,現在如果這段時間一直沒有風那麼隨機的數字也就是一直是1

  • 6 # 168肆捌

    首先把播放內容羅列到一個表裡,然後透過隨機函式取得該表的某一個ID(隨機),然後把該ID指向的內容讀入播放器播放。

  • 7 # 宰亢

    據我所知,隨機播放是程式碼寫好的,不是完全隨機。完全隨機很可能發生的事就是12139,而大多數人覺得121不科學,剛剛還聽過1,現在隔了一首歌,又來1,但其實機率學是可能的,機率還不小。所以為了營造一種“隨機”,所以都是程式碼寫好的。

  • 8 # 我想你很好看

    C/C++中我只知道,包含標頭檔案c語言<time.h>,或者c++標頭檔案<ctime>。然後隨機種子,srand((unsigned int)time(NULL)),最後就看你播放列表總歌曲數N,每次rand()%N的結果就是下次或者現在播放的歌曲,當然也可以先用一個臨時儲存每次隨機出來的數,判斷是否與正在播放的一樣,一樣就繼續隨機到不一樣就跳出迴圈。我想你既然已經可以實現播放,那麼列表控制元件,或者說列表容器中,應該很好獲取當前或者說,很好設定將來播放或者現在正在播放什麼吧,就好比下拉框,選項更改,肯定觸發相關事件,我覺得隨機播放,不是很簡單嗎?

  • 9 # 觀網掠影

    額,以前自學過一點程式設計。

    隨機歌曲效果,首先你的歌曲庫每首歌名有對應的編號123456。然後寫程式的時候取隨機數,然後讓它播對應編號的歌曲就行

  • 中秋節和大豐收的關聯?
  • 女生163學軌道交通專業好還是學前教育專業好?