2012-09-14 62 views
0

我想編寫一個函數GenString,它返回一個長度爲[0 .. 100]的隨機字符串,這個字符串基於用戶可以自定義的參數化函數GenChar如何在Free Pascal中創建一個隨機字符串?

也就是說,如果一個用戶希望生成所有a s的字符串,他能做到這一點通過傳遞,它總是返回a的功能,而另一個用戶可以生成隨機字母希伯來語單詞通過傳遞一個自定義GenChar功能它會返回隨機的希伯來字母。

引理1:我想寫一個函數GenArray,該函數生成任何類型的數組,其中返回的是傳入函數GenThing : sometype。這可以在Free Pascal中完成嗎?

引理2:我正在嘗試的是將QuickCheck端口轉換爲Free Pascal。

+0

看起來很簡單:創建'GenString'函數並定義'GenChar'函數原型。我錯過了什麼嗎? – Jay

+0

是的,我有麻煩**創建GenString函數**。您能否提供GenString函數的示例代碼? – mcandre

回答

6

下面是一個例子。由於提到了國際字符,因此使用Unicode字符串。

//The functions 

type 
    TGenChar = function: widechar; 

function GenString(MaxLength: integer; GenChar: TGenChar): widestring; 
var 
    i: integer; 
begin 
    if MaxLength < 1 then 
    MaxLength:= 1; //minimum length is 1 
    setlength(result, random(MaxLength+1)); 
    for i:= 1 to length(result) do 
    result[i]:= GenChar; 
end; 


//The usage example (remember to call randomize somewhere in your program) 

var 
    SampleCharSet: widestring= 'ABCxyz'; 

function SampleGenChar: widechar; 
begin 
    result:= SampleCharSet[random(length(SampleCharSet))+1]; 
end; 

function GetRandomStringSample: widestring; 
begin 
    result:= GenString(100, SampleGenChar); 
end; 
+1

除了主單元的初始化部分,或者在主控制器程序的主開始**之後,永遠不會*隨時隨地*調用隨機* *! – Thomas

+0

通常,'Randomize'應該只在程序啓動時調用一次,但是我沒有看到任何對控制檯程序的傷害,也沒有在其他任何地方調用它的危害,除了它不是線程安全的問題。你能解釋更多嗎? – Jay

+0

隨機化有時會使用當前時間來播種內部PRNG,通常只有毫秒的準確度。如果每個程序調用Randomize多次,特別是快速連續調用(比如說爲StringList或其他類型生成多個隨機字符串),則可能會出現兩次使用相同時間值爲PRNG播種的風險,從而產生相同的結果。當然這不是你的意圖,因爲GetRandomStringSample函數只是一個示例函數。 – Thomas

相關問題