1. <tr id="33chb"><label id="33chb"></label></tr>
  2. <pre id="33chb"></pre>
    當前位置:首頁 > 短網址資訊 > 正文內容

    FT12短網址:給你的女朋友解釋為什么隨機播放歌曲并不隨機

    FT12短網址的小編在周末的時候開車帶著女朋友出去玩。小編車里面隨機播放著五月天的歌曲。當小編正沉浸在『得兒飄,得兒飄,得兒意的飄』中,幻想著自己是秋名山車神,突然,旁邊的豆腐,哦不,女朋友說話了。


    誒,你車上的歌曲是隨機播放的嗎?和短網址的隨機跳轉是一個樣子的嗎?






    說白了:偽隨機性(英語:Pseudorandomness)是一個過程似乎是隨機的,但實際上并不是。偽隨機數是看似隨機實質是固定的周期性序列,也就是有規則的隨機。

    又拽概念了,你給我詳細講講吧。




    那么,什么是隨機數?

    隨機數在計算機應用中使用的比較廣泛,最為熟知的便是在密碼學中的應用。隨機數有3個特性,具體如下:

    隨機性:不存在統計學偏差,是完全雜亂的數列

    不可預測性:不能從過去的數列推測出下一個出現的數

    不可重現性:除非將數列本身保存下來,否則不能重現相同的數列

    音樂播放器的隨機播放又是如何實現的呢?

    現在的音樂播放器都比較智能了,都帶有一些類似于歌曲推薦的功能,會給聽眾隨機推薦歌曲,這種是基于用戶聽歌習慣的隨機推薦,不在我們討論的范圍內。我們只討論那種簡單的,比如使用簡單的播放器隨機播放一個CD卡中的列表的情況。

    常見的音樂隨機播放算法有兩種,分別是Random算法和Shuffle算法。

    Random算法

    Random算法相對比較簡單,播放當前歌曲時才隨機生成下一曲。

    Random算法是在選取即將播放的歌曲時,進行一個隨機數的運算,得到即將播放的歌曲在播放列表中的索引,播放列表本身并沒有被打亂,只是利用隨機函數從播放列表中選取一首歌曲進行播放而已。

    可以使用Java語言實現這種Random隨機數算法:

    Calendar ca = Calendar.getInstance();//獲取系統當前時間
    int i;
    Random rand =new Random(ca.get(Calendar.MINUTE)*ca.get(Calendar.SECOND));//將隨機數的種子設置為當前系統時間的分*秒
    i=rand.nextInt(maxnum);//maxnum是隨機數最大不超過得值

    Random算法另一個缺陷是當點擊“上一曲”時,跟“下一曲”功能完全一樣,都是重新生成隨機數,并利用它從播放列表中選取歌曲進行播放,而不會回到剛剛播放的那一首歌。

    這種方法不好,都沒辦法找到上一首了。其實也有解決辦法,比如提供個歷史紀錄來彌補。

    太麻煩了吧。還有另外的算法嗎?


    Shuffle算法

    Shuffle算法和排序算法正好相反,是從有序到亂序的一個過程,俗稱洗牌算法。

    它將播放列表中的歌曲順序打亂,變成一個和原來歌曲順序沒有任何關系的亂序的播放列表,之后進行歌曲的播放,并支持當用戶點擊“上一首”時,能夠回到剛剛播放的那一首歌曲。

    這種算法相對于Random算法來說,并不是完全意義上的隨機,只不過是對歌曲列表的亂序而已,歌曲的播放順序還是相對固定的。

    在Java中,有現成的shuffle算法實現,即Collections類中的兩個重載的shuffle方法:

    public static void shuffle(List list) {
        Random rnd = r;
        if (rnd == null)
            r = rnd = new Random();
        shuffle(list, rnd);
    }
    private static Random r;

    public static void shuffle(List list, Random rnd) {
        int size = list.size();
        if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
            for (int i=size; i>1; i--)
                swap(list, i-1, rnd.nextInt(i));
        } else {
            Object arr[] = list.toArray();

            // Shuffle array
            for (int i=size; i>1; i--)
                swap(arr, i-1, rnd.nextInt(i));

            // Dump array back into list
            ListIterator it = list.listIterator();
            for (int i=0; i<arr.length; i++) {
                it.next();
                it.set(arr[i]);
            }
        }
    }


    哦,那我們的播放器應該是使用Shuffle實現的吧。




    那我們這個就是偽隨機,如果使用Random就是真隨機了。




    真隨機與偽隨機

    隨機數分為真隨機數和偽隨機數,我們程序使用的基本都是偽隨機數,其中偽隨機又分為強偽隨機數和弱偽隨機數。

    • 真隨機數,通過物理實驗得出,比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等。需要滿足隨機性、不可預測性、不可重現性。

    • 偽隨機數,通過一定算法和種子得出。軟件實現的是偽隨機數。

      • 強偽隨機數,難以預測的隨機數。需要滿足隨機性和不可預測性。

      • 弱偽隨機數,易于預測的隨機數。需要滿足隨機性。

    上面介紹Random算法和Shuffle算法的時候,代碼實現都是偽隨機算法??梢赃@樣說:

    只要這個隨機數是由確定算法生成的,那就是偽隨機。只能通過不斷算法優化,使你的隨機數更接近隨機。

    有限狀態機不能產生真正的隨機數的,所以,現代計算機中,無法通過一個純算法來生成真正的隨機數,無論是哪種語言,單純的算法生成的數字都是偽隨機數,都是由可確定的函數通過一個種子,產生的偽隨機數。

    這也就意味著,如果知道了種子,就可以推斷接下來的隨機數序列的信息。這就有了可預測性。

    那么真隨機數怎么產生的呢?

    通過真實隨機事件取得的隨機數才是真隨機數。

    真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等。這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高,效率低。

    現有的真隨機數生成器,比如PuTTYgen的隨機數是讓用戶移動鼠標達到一定的長度,之后把鼠標的運動軌跡轉化為種子;Intel通過電阻和振蕩器來生成熱噪聲作為信息熵資源;Unix/Linux的dev/random和/dev/urandom采用硬件噪音生成隨機數;

    所以,要想生成真的隨機數,是無法用任何一個純算法實現的。都需要借助外部物理現象。

    ???這也太難了吧,想要生成個隨機數,竟然還要懂物理學。




    那你們平時工作重要使用隨機數怎么辦???




    Java中的隨機數生成器

    Java語言提供了幾種隨機數生成器,如前面提到的Random類,還有SecureRandom類。

    強隨機數發生器

    強隨機數發生器依賴于操作系統底層提供的隨機事件。強隨機數生成器的初始化速度和生成速度都較慢,而且由于需要一定的熵累積才能生成足夠強度的隨機數,所以可能會造成阻塞。熵累積通常來源于多個隨機事件源,如敲擊鍵盤的時間間隔,移動鼠標的距離與間隔,特定中斷的時間間隔等。所以,只有在需要生成加密性強的隨機數據的時候才用它。

    Java提供的強隨機數發生器是java.security.SecureRandom類,該類也是一個線程安全類,使用synchronize方法保證線程安全,但jdk并沒有做出承諾在將來改變SecureRandom的線程安全性。因此,同Random一樣,在高并發的多線程環境中可能會有性能問題。

    在linux的實現中,可以使用/dev/random/dev/urandom作為隨機事件源。由于/dev/random是堵塞的,在讀取隨機數的時候,當熵池值為空的時候會堵塞影響性能,尤其是系統大并發的生成隨機數的時候。

    偽隨機數生成器

    偽隨機數發生器采用特定的算法,將隨機數種子seed轉換成一系列的偽隨機數。偽隨機數依賴于seed的值,給定相同的seed值總是生成相同的隨機數。偽隨機數的生成過程只依賴CPU,不依賴任何外部設備,生成速度快,不會阻塞。

    Java提供的偽隨機數發生器有java.util.Random類和java.util.concurrent.ThreadLocalRandom類。

    Random類采用AtomicLong實現,保證多線程的線程安全性,但正如該類注釋上說明的,多線程并發獲取隨機數時性能較差。

    多線程環境中可以使用ThreadLocalRandom作為隨機數發生器,ThreadLocalRandom采用了線程局部變量來改善性能,這樣就可以使用long而不是AtomicLong,此外,ThreadLocalRandom還進行了字節填充,以避免偽共享。

    真隨機數發生器

    在Linux系統中,SecureRandom的實現借助了/dev/random/dev/urandom,可以使用硬件噪音生成隨機數;

    http://www.virginiabusinesslawupdate.com/,從1998年開始提供在線真隨機數服務了,它用大氣噪音生成真隨機數。他也提供了Java工具類,可以拿來使用。地址:https://sourceforge.net/projects/randomjapi/

    奧,我好像懂了。真隨機數生成要求太高了。所以一般都是用偽隨機數。




    可是,雖然我理解了,但是我還是希望歌曲的隨機可以真隨機怎么辦呢?




    為了躲避這個看(wu)似(li)合(qu)理(nao)的問題,我拉著她回到車子,找了一首她最喜歡的《演員》單曲循環了。


    掃描二維碼推送至手機訪問。

    版權聲明:本文由短鏈接發布,如需轉載請注明出處。

    本文鏈接:http://www.virginiabusinesslawupdate.com/article_535.html

    分享給朋友:

    相關文章

    IM 消息可靠性及一致性的解決方案

    IM 消息可靠性及一致性的解決方案

    即時聊天(IM)系統需要解決消息可靠性及消息一致性問題。消息可靠性,簡單來說就是不丟消息,會話一方發送消息,消息成功到達對方并正確顯示;消息一致性,包括發送一方消息一致及會話雙方消息一致,要求消息不重復,不亂序。消息發送實現過程消息發送一般...

    短網址自定義功能的測試

    測驗首要分為兩大部分, 功能性測驗和非功能性測驗。前次已經做了功能性測驗的解說,(沒閱讀的請閱讀《簡單高效的短網址生成服務C#實現》)下面解說自界說短網址測驗和非功能性測驗,全面的測驗過程,以確保ft12短網址的各項功能契合用戶的需求?! ?..

    低質量的社交不如高質量的獨處

    低質量的社交不如高質量的獨處

    來源:視覺志(QQ_shijuezhi)不知道你有沒有過這樣的感觸:一群人狂歡時的孤獨,有時會勝過一個人獨處。與其浪費時間精力,去做一些無用的社交,倒不如學會如何與自己相處。獨處,當然,是一個人。你要耐得住寂寞,專注自己正在做的事。如果是在...

    FT12短網址:人工智能最先應用的十大行業

    FT12短網址:人工智能最先應用的十大行業

    [ 短網址資訊 ] 5月25日,王明耀宣布了主題為《聯想之星人工智能出資規劃》的講演。他初次發表了聯想之星在人工智能范疇出資組合,體系闡釋了聯想之星在人工智能范疇的出資規劃。聯想之星在人工智能范疇出資62個項目,散布在10大職業,...

    百度VS谷歌,搜索引擎之戰,不可同日而語

    百度VS谷歌,搜索引擎之戰,不可同日而語

    “蛾兒雪柳黃金縷。笑語盈盈暗香去。眾里尋他千百度。驀然回首,那人卻在,燈火闌珊處?!边@大概就是“百度”的美妙出處。當一些想法被新的概念所淹沒時,許多人放棄了他們的原始想法,開始從事新事物。百度的故事是不同的。百度的歷史可追溯到谷歌仍在開發之...

    FT12短網址的API分享和簡介

    FT12短網址的API分享和簡介

    2008年初,FT12短網址發布了在線版鏈接生成器ft12.com。Google聲稱:"......(這是)互聯網上最安穩、最安全、最快速的短網址生成器。"有人做了比較,證實確實如此。從上圖能夠看到,ft12.com的響...

    發表評論

    訪客

    ◎歡迎參與討論,請在這里發表您的看法和觀點。
    一本色综合网久久
    1. <tr id="33chb"><label id="33chb"></label></tr>
    2. <pre id="33chb"></pre>