2013-02-03 52 views
5

如何在计划中生成随机?有没有特殊的形式,或者我需要创建一个程序?如果是这样,我该怎么做? (我试图创建一个称为随机选择的过程,输入两个策略并随机返回一个)计划 - 生成随机

+0

这个坏男孩可能会帮助,即使它关闭。 [方案:创建随机范围[闭合]] [1] [1]:http://stackoverflow.com/questions/12334891/scheme-creating-a-random-range – TopGunCoder

回答

5

该过程被调用,令人惊讶的是,random - 尽管确切的语法可能会不同,具体取决于Scheme解释器在使用(阅读文件!),但总体思路如下:

(random) 
=> 0.9113789707345018 

回访两个可能值之一,这将这样的伎俩在球拍:

注意,传递给random的3210参数强制它随机返回两个可能值之一:01。因此,如果(random 2)评估为0,则返回a,否则返回b

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

不是在标准的计划中,它不是。大多数实现都有创建随机数的功能,但它们并不全部使用相同的名称或相同的签名。例如,在Guile中有一个“随机”过程,但它至少需要一个参数并始终返回一个整数。所以你的代码会在Guile中导致一个错误(以及其他许多Scheme实现,我想)。如果没有标准答案,可以给出特定于实现的答案,但至少应该提及它是特定于实现的,以及它是特定的实现。 – sepp2k

+0

@ sepp2k我澄清了这一点,谢谢 –

+0

@ sepp2k如果按照“标准”包含“最终”SRFI(和我做的),[SRFI 27](http://srfi.schemers.org/srfi-27/srfi-27 .html)指定了一个获取随机数的接口。 –

5

标准方案不提供随机数发生器,尽管大多数Scheme实现提供了一个,但它们的细节往往不同。如果你想写一个便携式计划程序,很容易建立你自己的随机数发生器;这里有一个方法由于是Knuth:

(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)))) 

调用(random)返回0之间(含)的随机级分和1(不包括)。随机分数周期为m。调用(random seed)重置随机数发生器的种子,使得从相同种子开始的两个随机序列将是相同的;日期形式为YYYYMMDD制造良好种子(上面是Knuth的生日)。如果您想翻转硬币,请说:(if (< (random) 1/2) 'heads 'tails)

有时你想要一个范围内的随机整数。下面显示的randint函数返回lo(含)至(不包括)的范围内的随机整数; LO默认为0:

(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中的一种教学语言。

在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的条目 。

使用上述方法 的优点是,它很容易扩展到比两个更多的值 。