Random 如何在Smalltalk中生成范围内的随机整数?
我目前正在学习的一个课程要求我们在smalltalk中完成所有的编码(这是一个设计类)。在我们的一个项目中,我希望做一些事情,并且很难找到如何去做。似乎大多数人所做的就是修改他们自己版本的smalltalk来做他们需要它做的事情。我无权这样做,因为这会在我教授的计算机上造成错误,因为他没有与我相同的内置方法 以下是我想要做的: 随机数。我需要创建一个介于1和1000之间的随机数。现在我在假装Random 如何在Smalltalk中生成范围内的随机整数?,random,smalltalk,logical-operators,Random,Smalltalk,Logical Operators,我目前正在学习的一个课程要求我们在smalltalk中完成所有的编码(这是一个设计类)。在我们的一个项目中,我希望做一些事情,并且很难找到如何去做。似乎大多数人所做的就是修改他们自己版本的smalltalk来做他们需要它做的事情。我无权这样做,因为这会在我教授的计算机上造成错误,因为他没有与我相同的内置方法 以下是我想要做的: 随机数。我需要创建一个介于1和1000之间的随机数。现在我在假装 rand := Random new. rand := (rand nextValue) * 1000.
rand := Random new.
rand := (rand nextValue) * 1000.
rand := rand asInteger.
这给了我一个介于0和1000之间的数字。有没有一种方法可以在一个命令中实现这一点?近似
Random between: 0 and: 1000
和/或声明。这件事把我烦透了。我尝试了几种不同的配置
(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...
所以我用嵌套的ifTrue语句来伪装它:
(statement) ifTrue:[
(statement) ifTrue:[...
在smalltalk中,正确的方法是什么和/或随机?问题是
(expr) and: (expr) ifTrue: aBlock
被解析为方法和:ifTrue:
如果查看布尔类(特别是True或False),您会注意到ifTrue:只是一个常规方法,并且没有方法和:ifTrue:存在-但是,plain和:存在。因此,要明确这是两条信息,请编写
((expr) and: (expr)) ifTrue: aBlock
对于较长的布尔组合,请注意还有方法and:and:and:and:and:实现。至于随机问题:它取决于您使用的ST版本。在Squeak 3.9中,有一个
Random>#nextInt:
,它被记录为“在区间[1,整数]中回答一个随机整数”。其执行如下:
(self next * anInteger) truncated + 1
因此,我在这里有两点意见:
between: low and: high
^(self next * (high-low+1)) truncated + low
如果您使用的是VisualWorks,and:将一个块作为参数,那么您可以编写:
(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].
还有&
,它不接受块作为参数
aBoolean & anotherBoolean ifTrue:[doSomething].
区别在于和:仅当第一个bool为true时才计算块中的内容(类似于java),而&
总是同时计算这两个值
因此,和:
如果第二个条件在计算上很昂贵,或者如果它包括只有在第一个条件为真时才会发生的状态更改,那么它就很有用了。(这通常是一个糟糕的设计)
至于Random,只要您提供自定义方法,
Random>>介于:
和:之间,以及其他代码,它就可以在您的计算机上正常运行。具体如何做,取决于您传递作业的格式。要创建多个介于1和1000之间的随机整数(1 to: 1000) atRandom
首先创建一个随机数序列。只做一次
然后从序列中选取下一个数字,创建一个新的随机数。必要时重复
aRandomSeries := Random new .
"Seed a new series of random numbers"
aRandomInt := aRandomSeries newInt: 1000 .
"generate a random integer between 0 and 1000"
anotherRandomInt := aRandomSeries newInt: 1000 .
"generate another random integer between 0 and 1000"
逻辑运算
aBoolean
将响应和:
和或:
。它们都采用块参数
下面是它们的工作原理
和:可选块
如果接收器为真,则回答alternativeBlock的值;否则,在不计算alternativeBlock的情况下回答false
or:alternativeBlock
如果接收器为假,则回答alternativeBlock的值;否则,在不计算alternativeBlock的情况下回答true e、 g.
(3>2)或:[3<4]如果真的是:[]
aBoolean和:[另一个布尔]ifFalse:[]
但是,Squeak和Pharo Smalltalks都将接受括号中的参数()
Dolphin Smalltalk不会,并且严格要求块参数的标准Smalltalk语法 其他相关方法:
&
AND,不需要方括号(即块)参数|
不需要方括号(即块)参数的OR&
和|
在琥珀色、CUI、Gnu、Pharo、Squeak、VisualAge和VisualWorks Smalltalks中工作
Squeak Smalltalk还提供:和:和:}
和:和:和:}
它们采用多个块参数and:and:and:and}
或:或:}
or:or:or:}
这些接受多个块参数or:or:or:or:}
简单地说,不懂Smalltalk方言,我只能给出一个大概的答案。你回答随机问题的方式,是的,如果你的教授需要一个一般性的答案,这是唯一的方法
关于问题的陈述和/或陈述
和/或声明。这件事把我烦透了。我尝试了几种不同的配置
您想尝试的是:
(statement) and: [statement] ifTrue: [ ... ]
注意括号,and:方法将块作为参数。好吧,就是这样。我们根本不用Squeak。我们正在使用的版本只有next和nextValue。不过,您可以添加任何您认为有用的新方法。Martin所指的机制称为类扩展。基本上,您可以在其他地方定义的类上定义一个方法,并且仍然可以将该方法与其余代码打包在一起,无论是在文件输出还是提交中。方法完全取决于方言,但你仍然没有告诉我们你使用的是哪种方言…但这是不完整的,因为:需要一个街区,正如rydier所说。如果不使用And,则列将被解析为一元消息,并在之后导致解析错误,因为它只需要在列之后使用消息,而不需要完整表达式。将两个不同的问题分隔为两个单独的页面会很有用。
(statement) and: [statement] ifTrue: [ ... ]