Smalltalkの範囲でランダムな整数を生成するにはどうすればよいですか?
-
06-07-2019 - |
質問
現在受講しているクラスでは、smalltalkですべてのコーディングを行う必要があります(Designクラスです)。私たちのプロジェクトの1つで、私はいくつかのことをしたいと考えており、その方法を見つけるのに苦労しています。ほとんどの人が行うことは、自分が必要とすることを行うために、自分のバージョンのsmalltalkを変更することであるようです。私がこれと同じ組み込みメソッドを持っていない場合、教授のコンピューターでエラーが発生するため、これを行う自由はありません。
私がやろうとしていることは次のとおりです。
ランダム番号。 1から1000の間の乱数を作成する必要があります。今は
rand := Random new.
rand := (rand nextValue) * 1000.
rand := rand asInteger.
これにより、0〜1000の数値が得られます。1つのコマンドでこれを行う方法はありますか?
と同様Random between: 0 and: 1000
And / Orステートメント。これは、私から生きている昼光を害します。
のいくつかの異なる構成を試しました(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...
だから、ネストされたifTrueステートメントで偽造しています:
(statement) ifTrue:[
(statement) ifTrue:[...
smalltalkでの正しい方法および/またはランダムな方法は何ですか?
解決
問題はそれです
(expr) and: (expr) ifTrue: aBlock
はメソッドとして解析されますand:ifTrue:
ブール型クラス(特にTrueまたはFalseのいずれか)を見ると、ifTrue:は単なる通常のメソッドであり、メソッドand:ifTrue:は存在しませんが、 、プレーン、および:したがって、これらが2つのメッセージであることを明確にするには、次のように書きます
((expr) and: (expr)) ifTrue: aBlock
より長いブールの組み合わせについては、メソッドand:and:およびand:and:and:も実装されていることに注意してください。
他のヒント
(1 to: 1000) atRandom
VisualWorksを使用していて、:が引数としてブロックを取る場合、次のように記述します。
(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].
&
もあり、これは引数としてブロックを取りません。
aBoolean & anotherBoolean ifTrue:[doSomething].
違いはandです。最初のブール値がtrueの場合(javaと同様)、ブロック内の内容のみを評価しますが、and:
は常に両方を評価します。
このようにRandom >> between: and:
は、2番目の条件の計算コストが高い場合、または最初の条件がtrueの場合にのみ発生する状態変更が含まれている場合に役立ちます。 (しかし、それは通常悪い設計です。)
Randomに関しては、カスタムメソッド<=>とその他のコードを提供する限り、教授のコンピューターで正常に実行されます。具体的にどのように行うかは、割り当てを配信することになっている形式によって異なります。
ランダムの問題に関しては、使用するSTバージョンによって異なります。 Squeak 3.9にはRandom>>#nextInt:
があり、これは<!> quot;として文書化されています。間隔[1、anInteger]。<!> quot;でランダムな整数に答えます。その実装は読み取り
(self next * anInteger) truncated + 1
だからここに2つのコメントがあります:
- クラスブラウザの使用方法を実際に学習する必要があります。これは(よくある)質問<!> quot;クラスXのオブジェクトに送信できるメッセージ<!> quot;
-
STでは、既存のクラスに新しいメソッドを追加するのが一般的です。したがって、Randomを:と:の間に配置する場合は、追加するだけです。 as
between: low and: high ^(self next * (high-low+1)) truncated + low
簡単に言えば、Smalltalkの方言を知らずに、一般的な答えしか出せません。あなたがランダムな質問を述べた方法、はい、それはあなたの教授が一般的な答えを必要とする場合、それをする唯一の方法です。
および/またはステートメントの質問については、
And / Orステートメント。これは、私から生きている昼光を害します。私はいくつかの異なる構成を試しました
(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...
試してみたいのは:
(statement) and: [statement] ifTrue: [ ... ]
大括弧に注意してください。and:メソッドは引数としてブロックを取ります。
1〜1000のランダムな整数をいくつか作成するには
最初に乱数シリーズを作成します。これを一度だけ行います。
次に、シリーズから次の番号を取得して新しい乱数を作成します。必要に応じて繰り返します。
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
はand:
およびor:
に応答します。どちらもブロック引数を取ります。
これがどのように機能するかです。
and: alternativeBlock
受信者がtrueの場合、alternativeBlockの値に答えます。それ以外の場合、alternativeBlockを評価せずにfalseと答えます。
or: alternativeBlock
受信者がfalseの場合、alternativeBlockの値に答えます。それ以外の場合、alternativeBlockを評価せずにtrueと答えます。
e.g。
( 3 > 2 ) or: [ 3 < 4 ] ifTrue: [ ]
aBoolean and: [ anotherBoolean ] ifFalse: [ ]
ただし、SqueakとPharo Smalltalksは両方とも括弧内の引数を受け入れます( )
Dolphin Smalltalkは、ブロック引数の標準Smalltalk構文を必要とせず、厳密に必要とします。
その他の関連方法:
&
角括弧で囲まれた(ブロックなど)引数を必要としない AND
|
角括弧(つまりブロック)引数を必要としない OR
and:and: }
およびand:and:and: }
は、Amber、Cuis、Gnu、Pharo、Squeak、VisualAge、およびVisualWorks Smalltalksで動作します。
Squeak Smalltalkは以下も提供します。
and:and:and:and }
or:or: }
これらは複数のブロック引数を取ります
or:or:or: }
or:or:or:or: }
<=>これらは複数のブロック引数を取ります
<=>