2013-02-03 17 views
5

スキームでランダムを生成するにはどうすればよいですか?特殊なフォームがありますか、またはプロシージャを作成する必要がありますか?もしそうなら、どうしたらいいですか? (2つの戦略を入力し、ランダムに1つを返すランダム選択と呼ばれる手順を作成しようとしています)スキーム - ランダムを生成する

+0

この悪い男の子は、閉じていても助けになるかもしれません。 [スキーム:ランダム範囲[作成する閉じ] [1] [1]:http://stackoverflow.com/questions/12334891/scheme-creating-a-random-range – TopGunCoder

答えて

5

手順は驚くほど十分に、randomと呼ばれますが、Schemeインタプリタ使用中の(ドキュメントを読んで!)が、一般的な考え方は次のとおりです。

(random) 
=> 0.9113789707345018 

を2つの値のいずれかを返すために、これはラケットでトリックを行います:

ていることに注意してください引数をrandomに渡すと、ランダムに2つの値、0または1のいずれかが返されます。したがって、(random 2)0と評価された場合、aが返されます。そうでない場合はbが返されます。

(random-choice 4 2) 
=> 4 
(random-choice 4 2) 
=> 2 
+3

標準スキームではありません。ほとんどの実装では、乱数を作成する機能がありますが、すべてが同じ名前または同じシグネチャを使用するわけではありません。たとえばGuileには 'random'プロシージャがありますが、少なくとも1つの引数が必要で、常に整数を返します。だからあなたのコードはGuile(と他の多くのSchemeの実装も同様ですが、私が想像する)にエラーを引き起こします。標準的な回答がない場合は、実装固有の回答を与えることは大丈夫ですが、具体的な実装であり、具体的な実装であることを少なくとも言及する必要があります。 – sepp2k

+0

@ sepp2k私はこれを明確にしました –

+0

@ sepp2k「標準」で「最終的な」SRFI(および私が行う)を含む場合、[SRFI 27](http://srfi.schemers.org/srfi-27/srfi-27 .html)は、乱数を取得するためのインタフェースを指定します。 –

5

標準スキームは、乱数ジェネレータを提供していない、とほとんどのSchemeの実装は1を提供しますが、彼らは細部が異なる傾向にあります。移植可能なSchemeプログラムを作成したい場合は、独自の乱数ジェネレータを作成するのは簡単です。ここでの方法が原因クヌースにあります:(random)を呼び出す

(define random 
    (let ((a 69069) (c 1) (m (expt 2 32)) (seed 19380110)) 
    (lambda new-seed 
     (if (pair? new-seed) 
      (set! seed (car new-seed)) 
      (set! seed (modulo (+ (* seed a) c) m))) 
     (/ seed m)))) 

は(排他)0(包括的)と1の間のランダムな割合を返します。ランダム分数は、周期mで循環する。 (random seed)を呼び出すと乱数ジェネレータのシードがリセットされ、同じシードから始まる2つのランダムシーケンスが同一になります。 YYYYMMDDという形式の日付は良い種子を作る(それは上のクヌスの誕生日です)。硬貨を裏返したい場合は、(if (< (random) 1/2) 'heads 'tails)と言ってください。

範囲を超えてランダムな整数が必要な場合があります。以下に示すrandint関数は、の範囲の整数を返します。(含む)からの範囲は、(排他的)です。 0からLOデフォルト:このような

(define (randint . args) 
    (cond ((= (length args) 1) 
      (floor (* (random) (car args)))) 
     ((= (length args) 2) 
      (+ (car args) (floor (* (random) (- (cadr args) (car args)))))) 
     (else (error 'randint "usage: (randint [lo] hi)")))) 

乱数は、単純なシミュレーションには十分ですが、彼らは暗号アプリケーションには適していません注意してください。興味があれば、暗号アプリケーションに適したいくつかの乱数ジェネレータを含めて、my blogにあります。

1

DrRacketで宇宙船ゲームを実装することについての質問があったので、私はSchemeでDrRacketの教育言語の1つを意味すると考えます。

DrRacketで利用可能な機能に関する情報を見つける方法は簡単です。対話ウィンドウに「random」と書いてください。カーソルを上に置き、F1キーを押します。

HTDP-言語でrandom上のドキュメントはここにある:ランダムな値を返すために

http://docs.racket-lang.org/htdp-langs/beginner.html?q=random#(def.htdp-beginner.((lib._lang/htdp-beginner..rkt)._random))

一つの方法:ここで

(list-ref (list "one" "two") (random 2)) 

(2ランダム)は0または1を返します。 。 list-refは、リストのインデックス0またはインデックス1のエントリ を返します。

の上記の方法を使用する利点は、2つ以上の数値に拡張することが容易であるということです。

関連する問題