青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

如何生成均勻隨機排列(等概率生成排列)

      這個算法的應用,比如洗牌,這個大家都非常熟悉。很久以前用的是最原始的方法,就是一直rand()未出現的牌,直至生成所有的牌。
這當然是一個while(1)循環,很爛的算法吧。后面聽說直接交換牌,打亂即可了。但是打亂后生成的排列是隨機的么,是等可能隨機的么。
其實,這個問題上算法導論上早已經有了答案了,看過算法導論之后覺得沒看之前真的是算法修養太差了。
      算法的偽代碼如下圖所示:
      
      
      具體c++實現如下:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
// void Swap(int& nOne, int& nTwo)
// {
// nOne = nOne + nTwo;
// nTwo = nOne - nTwo;
// nOne = nOne - nTwo;
// }
void Swap(int& nOne, int& nTwo)
{
    int nTemp;
    nTemp = nOne;
    nOne = nTwo;
    nTwo = nTemp;
}
//返回一個在區間[nBeg, nEnd]內的隨機數
int Random(int nBeg, int nEnd)
{
    assert(nEnd >= nBeg);
    if (nBeg == nEnd)
    {
        return nBeg;
    }
    else
    {
        return rand() % (nEnd - nBeg + 1) + nBeg;
    }
}
void RandomizeInPlace(int* pnA, int nLen)
{
    static bool s_bFirst = false;
    if (!s_bFirst)
    {
        srand(time(NULL));
        s_bFirst = true;
    }
    
    for (int i = 0; i < nLen; ++i)
    {
        Swap(pnA[i], pnA[Random(i, nLen - 1)]);
    }
}
int main()
{
    int nArray[20];
    int i, j;
    for (i = 1; i <= 20; ++i)
    {
        int nCnt = i;
        while (nCnt--)
        {
            for (j = 0; j < i; ++j)
            {
                nArray[j] = j;
            }
            RandomizeInPlace(nArray, i);
            for (j = 0; j < i; ++j)
            {
                printf("%d ", nArray[j]);
            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}

   運行效果圖片如下:

   根據運行結果大致就可以感覺到,生成的排列都是隨機的。
   這里要多說一句那就是我注釋的那個交換函數其實是有bug的,也許這才是不提倡使用這個交換方法的真正原因,而不僅僅是
難以理解。用同一個變量去調用該函數,會將該變量置0,而不是保持原來的值!!!

   至于如何證明這個算法生成的均勻隨機的排列,可以參考算法導論5.3節最后一部分。
   證明的大致思路是利用循環不變式的證明方法:證明i次循環后得到某個排列的概論是(n -i)! / n!,那么n次循環后得到最終那個排列的
概論就是1/n!,這樣就證明了該算法能夠得到均勻隨機排列。
   這個算法其實就是隨機化算法的一種,其實快排也有所謂的隨機化版本,改動的地方只是隨機選擇了中軸元素而已,這個
在算法導論上也有介紹。

posted on 2012-02-26 16:07 yx 閱讀(3415) 評論(8)  編輯 收藏 引用 所屬分類: 隨機算法

評論

# re: 如何生成均勻隨機排列(等概率生成排列) 2012-02-26 20:39 driftfly

rand本身不是隨機  回復  更多評論   

# re: 如何生成均勻隨機排列(等概率生成排列) 2012-02-26 21:45 遠行

這個算法本身就是建立在它是隨機基礎上的,偽代碼里面那個Randomize,當然實現的時候也假設了rand()是隨機的了,至于它的隨機程度就不考慮了,你也可以采用更好的生成隨機數的接口@driftfly
  回復  更多評論   

# re: 如何生成均勻隨機排列(等概率生成排列) 2012-02-27 20:28 cmdblock

其實就是雙隨機而已,既隨機牌的大小又隨機位置。不過這種方法,個人覺得一般般啦  回復  更多評論   

# re: 如何生成均勻隨機排列(等概率生成排列) 2012-02-27 21:29 遠行

這個算法主要是可以證明等概率打亂排列@cmdblock
  回復  更多評論   

# re: 如何生成均勻隨機排列(等概率生成排列) 2012-08-10 10:12 peakflys

挺好的方法,無論是從空間上還是時間上 都是不錯的算法  回復  更多評論   

# re: 如何生成均勻隨機排列(等概率生成排列) 2012-10-16 12:25 liyonghelpme

有一種多項式生成排列的方式可以看看~~
http://en.wikipedia.org/wiki/Permutation_polynomial  回復  更多評論   

# re: 如何生成均勻隨機排列(等概率生成排列) 2013-10-09 10:15 justcyf

for (j = 0; j < i; ++j)

{

nArray[j] = j;

}

main函數里面的這段,第一行是不是寫錯了?應該為for(j = 0;j<20;++j)  回復  更多評論   

# re: 如何生成均勻隨機排列(等概率生成排列) 2013-10-09 10:17 justcyf

sorry,看錯了。。。@justcyf
  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

導航

統計

公告

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

me

好友

同學

網友

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久久综合色一本| 亚洲国产裸拍裸体视频在线观看乱了中文 | 99视频精品在线| 国产精品入口日韩视频大尺度| 亚洲精品欧美激情| 欧美大片免费观看在线观看网站推荐| 欧美在线精品一区| 亚洲一区视频在线| 亚洲色在线视频| 在线视频欧美精品| 日韩视频一区二区三区在线播放 | 亚洲精品永久免费| 亚洲三级国产| 亚洲国产精品va在看黑人| 欧美成人日本| 免费久久99精品国产| 久热re这里精品视频在线6| 久久国产黑丝| 久久午夜色播影院免费高清| 一区二区电影免费观看| 在线亚洲伦理| 亚洲视频国产视频| 亚洲一区二区三| 亚洲欧美成人一区二区三区| 亚洲欧美日韩另类| 久久精品国产99| 久久手机免费观看| 亚洲第一精品福利| 欧美国产精品va在线观看| 亚洲成人资源| 一区二区三区 在线观看视| 中文一区二区| 久久国产精彩视频| 欧美超级免费视 在线| 欧美日韩国产精品成人| 国产精品www994| 韩曰欧美视频免费观看| 亚洲欧洲日夜超级视频| 亚洲一区精品视频| 久久免费观看视频| 亚洲丰满在线| 中文在线一区| 另类人畜视频在线| 国产精品欧美风情| 亚洲国产91| 亚洲欧美在线免费| 久久全球大尺度高清视频| 欧美成人一区二区三区| 99爱精品视频| 久久综合五月| 中文无字幕一区二区三区| 欧美一区二区大片| 午夜精品av| 欧美肥婆在线| 亚洲视频在线二区| 美女精品自拍一二三四| 欧美韩日亚洲| 红桃视频国产精品| 亚洲欧美日韩另类| 亚洲人成人77777线观看| 午夜精品久久久久久99热| 欧美成人a视频| 激情欧美一区二区三区在线观看| 中文av字幕一区| 久久精品中文字幕一区| 亚洲精品在线观看视频| 久久夜色精品国产欧美乱极品| 国产精品vvv| 亚洲黄页一区| 麻豆国产精品777777在线 | 99精品国产在热久久婷婷| 久久影院亚洲| 国产字幕视频一区二区| 亚洲欧美在线aaa| 美女亚洲精品| 久久综合影音| 在线免费观看日韩欧美| 免费欧美高清视频| 欧美激情久久久久| 亚洲一区二区影院| 篠田优中文在线播放第一区| 国内久久视频| 亚洲国产欧美不卡在线观看| 欧美日韩喷水| 欧美一区二区三区在线视频 | 国产一区二区日韩精品欧美精品 | 米奇777超碰欧美日韩亚洲| 免费看成人av| 亚洲一区在线看| 欧美怡红院视频| 亚洲国产清纯| 亚洲一区二区三区在线| 在线观看视频一区二区欧美日韩| 亚洲精品女av网站| 国产精品国产三级国产aⅴ浪潮 | 久久中文精品| 欧美日韩一二三区| 久久国产视频网| 欧美久久综合| 免费观看国产成人| 国产精品女主播一区二区三区| 国产美女精品视频免费观看| 99伊人成综合| 午夜精品视频网站| 亚洲美女视频在线观看| 亚洲综合日韩中文字幕v在线| 在线观看亚洲精品| 亚洲一区亚洲二区| 亚洲精品午夜| 久久久精品午夜少妇| 亚洲欧美日韩专区| 欧美大片免费看| 久久香蕉精品| 国产精品一区二区三区乱码| 亚洲高清视频的网址| 国产香蕉97碰碰久久人人| 一本大道av伊人久久综合| 亚洲激情成人在线| 久久国产主播精品| 久久国产福利国产秒拍| 国产精品萝li| 一本到高清视频免费精品| 亚洲精品视频一区| 久久婷婷国产综合精品青草| 久久久久免费| 国产一区二区三区免费观看| 亚洲一区久久久| 欧美亚洲日本网站| 国产精品国产福利国产秒拍| 99av国产精品欲麻豆| 99精品视频免费观看视频| 欧美成人一区二区三区片免费| 另类综合日韩欧美亚洲| 国产一区二区毛片| 欧美淫片网站| 美女诱惑一区| 亚洲激情视频| 欧美刺激性大交免费视频| 亚洲国产成人不卡| 日韩视频不卡| 国产精品地址| 午夜精品剧场| 免费欧美视频| 日韩一级精品| 欧美日韩一二三区| 亚洲影院免费| 久久免费视频网| 亚洲国产天堂久久综合网| 欧美成人第一页| 日韩亚洲成人av在线| 亚洲免费小视频| 国产乱码精品一区二区三| 午夜欧美精品| 欧美不卡高清| 一区二区三区不卡视频在线观看| 欧美日韩免费观看一区=区三区| 亚洲精品视频啊美女在线直播| 亚洲淫性视频| 一区视频在线播放| 欧美jjzz| 一区二区三区久久精品| 久久国产精品免费一区| 在线欧美电影| 国产精品对白刺激久久久| 亚洲欧美综合国产精品一区| 欧美成人xxx| 亚洲欧美精品| 亚洲国产精品一区| 国产精品国内视频| 久久综合色天天久久综合图片| 国产精品视频不卡| 久久青青草综合| 亚洲人成精品久久久久| 欧美精品日韩www.p站| 欧美一区成人| 欧美精品一卡二卡| 久久久美女艺术照精彩视频福利播放 | 一本色道久久综合精品竹菊| 国产精品专区一| 欧美va天堂| 国产欧美日韩激情| 最新国产成人在线观看| 国产综合久久久久久| 国产精品99久久久久久人| 1024亚洲| 欧美久久视频| 艳女tv在线观看国产一区| 久久久亚洲国产天美传媒修理工| 久久久综合精品| 欧美在线观看网址综合| 久久一区二区三区av| 亚洲精品国精品久久99热| 欧美在线首页| 亚洲午夜电影在线观看| 亚洲国产综合在线看不卡| 国产伪娘ts一区| 国产精品区一区二区三区| 欧美精品在欧美一区二区少妇| 久久精品国产一区二区三区| 亚洲一区二区三|