Как я могу генерировать случайные целые числа в диапазоне в Smalltalk? - PullRequest
3 голосов
/ 07 ноября 2008

Класс, который я посещаю в настоящее время, требует от нас выполнения всего нашего кодирования в smalltalk (это класс Design). В одном из наших проектов я хочу кое-что сделать, и мне сложно найти способ их сделать. Кажется, что большинство людей модифицируют свою собственную версию 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?

Ответы [ 6 ]

6 голосов
/ 07 ноября 2008

Проблема в том, что

 (expr) and: (expr) ifTrue: aBlock

анализируется как метод and:ifTrue: Если вы посмотрите на логический класс (и, в частности, на True или False), вы заметите, что ifTrue: просто обычный метод, и что никакого метода и: ifTrue: не существует - однако , добрая и: делает. Чтобы было понятно, что это два сообщения, напишите

((expr) and: (expr)) ifTrue: aBlock

Для более длинных логических комбинаций обратите внимание, что существуют также методы и: и: и и: и: и: реализованы.

5 голосов
/ 22 ноября 2008
(1 to: 1000) atRandom
5 голосов
/ 13 ноября 2008

Если вы используете VisualWorks, а: принимает блок в качестве аргумента, вы должны написать:

(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].

Существует также &, который не принимает блок в качестве аргумента,

aBoolean & anotherBoolean ifTrue:[doSomething].

Разница заключается в том, что: только то, что находится в блоке, оценивается только в том случае, если первый логический тип true (аналог java), а & всегда оценивает оба.

Таким образом, and: пригодится, если второе условие вычислительно дорого, или если оно включает изменения состояния, которые должны происходить только тогда, когда первое условие истинно. (обычно это плохой дизайн).

Что касается Random, то пока вы предоставляете свой пользовательский метод, Random >> between: and:, а также весь остальной код, он прекрасно работает на вашем компьютере профессора. Как это сделать конкретно, зависит от формата, в котором вы должны выполнить назначение.

4 голосов
/ 07 ноября 2008

Что касается случайной проблемы: это зависит от того, какую версию ST вы используете. В Squeak 3.9 есть Random>>#nextInt:, что задокументировано как «Ответить случайному целому числу в интервале [1, anInteger].». Его реализация гласит

(self next * anInteger) truncated + 1

Итак, у меня есть два комментария:

  1. Вы должны действительно научиться пользоваться браузером классов. Это может ответить на (частые) вопросы "какие сообщения я могу отправлять объектам класса X"
  2. Обычно в ST добавляются новые методы к существующим классам. Так что, если вы хотите, чтобы Random имел значения между: и :, просто добавьте его, например, в

    between: low and: high      
       ^(self next * (high-low+1)) truncated + low
    
0 голосов
/ 23 ноября 2015

Проще говоря, не зная диалекта Smalltalk, я могу дать только общий ответ. То, как вы задали случайный вопрос, да, это единственный способ сделать это, если вашему профессору нужен общий ответ.

Что касается вопроса и / или утверждений,

И / или заявления. Этот вышибает из меня живые дневные огни. Я пробовал несколько разных конфигураций

(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...

То, что вы хотите попробовать:

(statement) and: [statement] ifTrue: [ ... ]

обратите внимание на квадратные скобки, метод and: принимает блок в качестве аргумента.

0 голосов
/ 22 ноября 2015

Для создания нескольких случайных целых чисел от 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
Если получатель верен, ответьте на значение alternativeBlock; в противном случае ответьте false, не оценивая alternativeBlock

or: alternativeBlock
Если получатель имеет значение false, ответьте на значение alternativeBlock; в противном случае ответьте true, не оценивая alternativeBlock.

, например
( 3 > 2 ) or: [ 3 < 4 ] ifTrue: [ ]
aBoolean and: [ anotherBoolean ] ifFalse: [ ]

Однако Squeak и Pharo Smalltalks будут принимать аргумент в скобках ( )
Dolphin Smalltalk не будет и строго требует стандартного синтаксиса Smalltalk для аргумента блока.

Другие связанные методы:
& и И , для которых не требуется аргумент в квадратных скобках (т.е. блок)
| и ИЛИ , для которых не требуется аргумент в квадратных скобках (т.е. блок)
& и | работают в Smalltalks Amber, Cuis, Gnu, Pharo, Squeak, VisualAge и VisualWorks.

Squeak Smalltalk также обеспечивает:
and:and: }
and:and:and: } Они принимают несколько аргументов блока
and:and:and:and }

or:or: }
or:or:or: } Они принимают несколько аргументов блока
or:or:or:or: }

...