《程式設計珠璣》 生成隨機文字

2021-06-22 19:45:20 字數 2132 閱讀 7509

生成文字:

《程式設計珠璣》上面最後的一小節講的是如何生成隨機文字的馬爾可夫方法, 

大家如果想對馬爾可夫鏈有個初步的了解,可以看看吳軍的《數學之美》p52上關於這部分的簡略介紹,說的簡單點就是在乙個狀態序列中,t時刻的狀態一般情況下是與前面所有的狀態均有關係,但是為了近似,簡化運算,我們大致上認為僅與前面k個狀態相關,用概率公式標示就是p(s(t)|s(0),s(1),.......s(t-1))==p(s(t)|s(t-1),...s(t-k+1));

同時需要注意的一點就是對於當前的狀態s,向下乙個各個狀態所有可能的取值的概率是不相同的,比如說如果我們統計在詞典中每個字母的下乙個字母出現的頻率的話,會發現不是所有的26個字母的出現的頻率都是一樣的,也就是說這裡有個狀態轉移概率的問題,而我們選擇的是轉移概率最大的取值作為下乙個狀態的可能結果.       

如果我上面說的不是很明白的話,我們可以看乙個由字母生成的隨機文字上的馬爾可夫過程,首先輸入乙個文字,然後我們統計每個字母(相當於當前狀態s)的下乙個字母出現的頻率分布,比如說a後面出現10次c,5次d。。。。。這個時候當生成隨機文字的時候我們就需要根據上面的狀態轉移概率(具體的為頻率)中最大的乙個來確定該選取哪個作為下乙個狀態的取值,當然我們需要乙個初始狀態s0,至於怎麼選,看自己愛好吧

ps:作者並沒有我說的選擇出現的頻率最大的乙個作為下乙個可能的狀態,而是隨機的選取了乙個,這個在演算法當中有體現

好了說了這麼多,我們進入作者真正的演算法當中,體會大師的思想去,在這之前我需要說明的是大師的演算法當中對於每個狀態的限定為乙個單詞,而不是上面我寫的例子中的字母,這樣處理是有好處的,畢竟要是使用字母的話,生成的乙個狀態序列都不一定是單詞。

下面是**片段:

#include  #include  #include  const int k=2;//k代表的是幾階馬爾可夫鏈

char inputchars[500000];//儲存輸入的用於生成隨機文字的字串

char* word[10000];//字尾陣列,用於排序

const int nword=0;

int wordcmp(const char*,const char*);

int sortcmp(const void*,const void*);

void creatrandtext();

char* skip(char* ,int);

int main(void)

//上面的最後的加1是為了儲存'\0'作為每個單詞的結束符

//同時將word[0]賦值為inputchars,這樣輸入的字元都會儲存在inputchars陣列當中

//這樣其實當最後輸入結束的話,word[i]指向的是第i+1個單詞在inputchars陣列中

//的首位址

for(int i=0;i0;wordleft--)

for(int i=0;wordcmp(word[u],phrase)==0;i++)

phrase=skip(p,1);//需要注意的是這裡選擇phrase作為當前狀態,那麼為什麼選擇

//從第二個單詞開始的位置呢?

//這是因為馬爾可夫鏈的關係,當隨著狀態的推進,當前狀態的前k個也在不斷的向前

//推進

if(strlen(skip(phrase,k-1))==0)

break;

printf("%s ",skip(phrase,k-1));}}

char* skip(char* p,int k)

return p;

}

//由上面的**片段當中我們可以看到作者並沒有根據出現的頻率來選取下乙個可能的狀態,而是採用隨機選取的方法,這個在二分查詢的下一行可以看出來,所以這是個具有相同轉換概率的馬爾可夫鏈,同時二分查詢用來查詢第一次出現的位置,而不是別的什麼任意的位置
作者在最後給出了處理字串常用的幾種資料結構:

字尾陣列:這兩次都用到了
希望對大家有幫助

程式設計珠璣 Floyd隨機抽樣

對於n個樣本,如何均勻隨機的取出m個樣本?即n個樣本中每個樣本都能有m n的概率被取中。1.簡單插入取樣 這是最基本,最直觀的方法。在乙個初始為空的集合中插入1 n的隨機整數,知道個數為m個為止。但這個方法有個弱點,就是要插入乙個數時,判斷集合中是否存在該數,如果其存在,則要繼續取樣直到取到乙個不在...

程式設計珠璣 續(程式設計珠璣 修訂版)

經久不衰的電腦科學名著 集深邃思想 實戰技術與趣味軼事於一冊 領略電腦科學之美 程式設計珠璣 續 作譯者介紹 譯者 錢麗豔 劉田叢書名 圖靈程式設計叢書 出版社 人民郵電出版社 isbn 9787115251510出版日期 2011 年5月 程式設計珠璣 續 是電腦科學方面的經典名著 程式設計珠璣 ...

程式設計珠璣 心得

第一部分 基礎 第1章 開篇 1.1 一次友好的對話 1.2 準確的問題描述 1.3 程式設計 1.4 實現概要 1.5 原理 1.6 習題 1.7 深入閱讀 第2章 啊哈!演算法 2.1 三個問題 2.2 無處不在的二分搜尋 2.3 基本操作的威力 2.4 排序 2.5 原理 2.6 習題 2.7...