Smalltalkの範囲でランダムな整数を生成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/271394

質問

現在受講しているクラスでは、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つのコメントがあります:

  1. クラスブラウザの使用方法を実際に学習する必要があります。これは(よくある)質問<!> quot;クラスXのオブジェクトに送信できるメッセージ<!> quot;
  2. 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"

論理演算

aBooleanand:および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: }
<=>これらは複数のブロック引数を取ります
<=>

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top