Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Random 如何在Smalltalk中生成范围内的随机整数?_Random_Smalltalk_Logical Operators - Fatal编程技术网

Random 如何在Smalltalk中生成范围内的随机整数?

Random 如何在Smalltalk中生成范围内的随机整数?,random,smalltalk,logical-operators,Random,Smalltalk,Logical Operators,我目前正在学习的一个课程要求我们在smalltalk中完成所有的编码(这是一个设计类)。在我们的一个项目中,我希望做一些事情,并且很难找到如何去做。似乎大多数人所做的就是修改他们自己版本的smalltalk来做他们需要它做的事情。我无权这样做,因为这会在我教授的计算机上造成错误,因为他没有与我相同的内置方法 以下是我想要做的: 随机数。我需要创建一个介于1和1000之间的随机数。现在我在假装 rand := Random new. rand := (rand nextValue) * 1000.

我目前正在学习的一个课程要求我们在smalltalk中完成所有的编码(这是一个设计类)。在我们的一个项目中,我希望做一些事情,并且很难找到如何去做。似乎大多数人所做的就是修改他们自己版本的smalltalk来做他们需要它做的事情。我无权这样做,因为这会在我教授的计算机上造成错误,因为他没有与我相同的内置方法

以下是我想要做的:

随机数。我需要创建一个介于1和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
因此,我在这里有两点意见:

  • 您应该真正学会使用类浏览器。这可以回答(常见的)问题“我可以向类X的对象发送哪些消息”
  • 在ST中,向现有类添加新方法是很常见的。因此,如果您希望Random的值介于:和之间,只需添加它,例如

    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: [ ... ]