2016-11-12 16 views
-1

こんにちは私はランダムに作るこの関数を持っています:a、b、cまたはd。ラケットのランダム関数

(define random-abcd 
    (let ([n (random 4)]) 
    (cond [(equal? n 0) 'A] 
      [(equal? n 1) 'B] 
      [(equal? n 2) 'C] 
      [else 'D]))) 

つまり、4つのランダムな出力が可能です。しかし、パラメータとして与える数値の間に出力を与える再帰的な関数を構築したいと思います。例えば

ランダム私の3 - >与え、出力間:B、Cの

ランダム私の5 - >与えますとの間の出力:

ありがとうbはCのDまたはE!

答えて

1

あなたは数nを渡すことができますし、あなたが範囲[0,n>で乱数rを取得するために(random n)を行うことができます。今#\aのためのchar数はあなたが(integer->char (+ 97 r))を行う場合は、0ため#\a1ため#\bを、得るので97です...

あなたは(list->string (list #\a)) ; ===> "a"文字列を取得することができます。

あなたは、私が一緒にそれをすべて置くためにあなたにそれを残し(string->symbol "a") ; ==> a

のシンボルを得ることができ、しかし、それは再帰的ではありません。 n番目の文字までのn個の文字のランダムなリストを生成する

+0

これは、しかし、より読みやすく(およびポータブルです私は97の代わりに ''(char-> integer#\ a) 'を使うことにしました。また、' 'integer-> char' ' number-> char'。 –

+0

@ ChrisJester-Young私はそれらのプロシージャで常に 'number'と' integer'を混同していますので、私は更新しました。 '(char-> integer#\ a)'はasciiで '97'と同じですが、utf-8では7ビットasciiで始まるので、別の答えが得られるようなことではありませんが、明快にする方が良いかもしれません。 – Sylwester

1

楽しい問題。私はこれを行うために考えることができる1つの方法は、(それはゼロインデックスとランダムアクセスのため)ベクトルを使用し、数値を与え、その値より小さい乱数を選択することです。数値を取得したら、それをベクトルのインデックスとして使用して、そのインデックスのベクトルの文字を取得します。本質的には、ベクトルの「スライス」にランダムにインデックスを付け、スライスのサイズは入力引数で決まります。

0

試してみてください。

(list-ref '(a b c d e f) (random 6)) 
0

再帰FN:

(define (f n (ol '())) 
    (if (= n (length ol)) 
     ol 
     (f n (cons (string (integer->char (+ 97 (random n)))) ol)))) 

テスト:

(f 5) 

出力:

'("b" "d" "b" "e" "e") ; list will have random letters; 
関連する問題