Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 方案-随机生成_Scheme - Fatal编程技术网

Scheme 方案-随机生成

Scheme 方案-随机生成,scheme,Scheme,如何在Scheme中生成random?是否有特殊的表格或我是否需要创建一个程序?如果是,我该怎么做?(我正在尝试创建一个名为random choice的过程,该过程输入两个策略并随机返回一个。)该过程被调用,令人惊讶的是,random——尽管确切的语法可能因使用的Scheme解释器而异(请阅读文档!),但总体思路如下: (random) => 0.9113789707345018 对于返回两个可能值中的一个,这将在Racket中执行以下操作: (define (random-choice

如何在Scheme中生成random?是否有特殊的表格或我是否需要创建一个程序?如果是,我该怎么做?(我正在尝试创建一个名为random choice的过程,该过程输入两个策略并随机返回一个。)

该过程被调用,令人惊讶的是,
random
——尽管确切的语法可能因使用的Scheme解释器而异(请阅读文档!),但总体思路如下:

(random)
=> 0.9113789707345018
对于返回两个可能值中的一个,这将在Racket中执行以下操作:

(define (random-choice a b)
  (if (zero? (random 2)) a b))
请注意,传递给
random
2
参数强制它随机返回两个可能值中的一个:
0
1
。因此,如果
(随机2)
的计算结果为
0
,则返回
a
,否则返回
b

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

标准方案不提供随机数生成器,尽管大多数方案实现都提供了随机数生成器,但它们的细节往往有所不同。如果你想写一个可移植的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))))
调用
(随机)
返回0(包含)和1(排除)之间的随机分数。随机分数周期为m。调用
(随机种子)
重置随机数生成器的种子,以便从同一种子开始的两个随机序列相同;YYYYMMDD形式的日期是很好的种子(上面是Knuth的生日)。如果你想掷硬币,说:
(如果(<(随机)1/2)‘正面’反面)

有时需要一个范围内的随机整数。下面显示的
randint
函数返回lo(包含)到hi(排除)范围内的随机整数;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)"))))

像这样的随机数对于简单的模拟来说已经足够好了,但是要注意它们不适合于加密应用。如果您感兴趣,我有几个随机数生成器,包括一些适用于加密应用的生成器。

因为您的另一个问题是关于在DrRacket中实现一个宇宙飞船游戏,我假设,Scheme指的是DrRacket中的一种教学语言

在DrRacket中查找可用函数信息的方法很简单。在交互窗口中写入,例如,
random
。将光标放在顶部,然后按F1键

htdp语言中的
random
文档如下:

返回随机值的一种方法:

(list-ref (list "one" "two") (random 2))
此处(随机2)将返回0或1。 因此,list ref将返回条目 使用列表的索引0或索引1

使用上述方法的优势 它很容易扩展到更多的值
不止两个。

这个坏男孩可能会帮忙,即使它已经关闭了。[方案:创建随机范围[关闭][1][1]:不在标准方案中,不在标准方案中。大多数实现都有创建随机数的功能,但它们并不都使用相同的名称或签名。例如,Guile中有一个
random
过程,但它至少需要一个参数,并且总是返回一个整数。因此,您的代码将在Guile中导致错误(我想,还有许多其他方案实现)。如果没有标准答案,可以给出特定于实现的答案,但您至少应该提到它是特定于实现的,并且特定于哪个实现。@sepp2k如果按“标准”包含“最终”SRFI(我也是),则指定用于获取随机数的接口。