Como posso gerar inteiros aleatórios em um intervalo em Smalltalk?
-
06-07-2019 - |
Pergunta
A classe estou tendo atualmente requer que façamos todo o nosso codificação em Smalltalk (é uma classe de design). Em um de nossos projetos, eu estou olhando para fazer algumas coisas, e estou tendo um momento difícil encontrar a forma de fazê-las. Parece que o que a maioria das pessoas fazer é modificar a sua própria versão de Smalltalk para fazer o que eles precisam fazer. Eu não tenho a liberdade de fazer isso, pois isso causaria um erro no computador do meu prof quando ele não tem o mesmo built-in métodos que eu faço.
Aqui está o que eu estou procurando fazer:
números aleatórios. Eu preciso criar um número aleatório entre 1 e 1000. Agora eu estou fingindo, fazendo
rand := Random new.
rand := (rand nextValue) * 1000.
rand := rand asInteger.
Isso me dá um número entre 0 e 1000. Existe uma maneira de fazer isso em um comando? semelhante ao
Random between: 0 and: 1000
e / ou declarações. Este um insetos vivos daylights fora de mim. Eu tentei várias configurações diferentes de
(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...
Então, eu estou fingindo com as declarações ifTrue aninhados:
(statement) ifTrue:[
(statement) ifTrue:[...
O que é a maneira correta de fazer e / ou e aleatória em Smalltalk?
Solução
O problema é que
(expr) and: (expr) ifTrue: aBlock
é analisado como o and:ifTrue:
método Se você olhar para a classe booleana (e Verdadeiro ou Falso, em particular), você percebe que ifTrue: é apenas um método regular, e que nenhum método e: ifTrue: existe - porém, plain e faz. Então, para deixar claro que estas são duas mensagens, escreva
((expr) and: (expr)) ifTrue: aBlock
Para combinações mais boolean, aviso que existem também métodos e: e: ee: e: e:. Implementadas
Outras dicas
(1 to: 1000) atRandom
Se você estiver usando VisualWorks, e: leva um bloco como um argumento, então você escreveria:
(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].
Há também &
, que não leva um bloco como argumento,
aBoolean & anotherBoolean ifTrue:[doSomething].
A diferença é e:. Avalia apenas o que está no bloco se o primeiro bool é verdade (semelhante ao java), enquanto &
sempre avalia tanto
Assim and:
vem a calhar se a segunda condição é computacionalmente caro, ou se ele inclui alterações de estado que só deve acontecer quando a primeira condição é verdadeira. (Que é geralmente um design ruim embora).
Quanto ao acaso, enquanto você entregar o seu método personalizado, Random >> between: and:
, bem como o resto do seu código, ele funciona muito bem em seu computador professores. Como fazer isso especificamente, depende do formato em que você é suposto para entregar a tarefa.
Quanto à questão aleatória: isso depende do que ST versão que você usa. Em rangido 3,9, há Random>>#nextInt:
, que está documentado como "Resposta um número aleatório no intervalo [1, anInteger].". Sua implementação lê
(self next * anInteger) truncated + 1
Então, eu tenho dois comentários aqui:
- Você realmente deve aprender a usar o navegador de classe. Isso pode responder às perguntas (frequentes) "que mensagens que pode enviar para objetos da classe X"
-
É comum, no ST, para adicionar novos métodos para classes existentes. Então se você quer aleatória ter entre: e :, basta adicioná-la, por exemplo, como
between: low and: high ^(self next * (high-low+1)) truncated + low
Para colocá-lo simplesmente, sem saber o dialeto Smalltalk, eu só posso dar uma resposta geral. A maneira como você declarou a pergunta aleatória, sim essa é a única maneira de fazê-lo se o seu professor precisa de uma resposta genérica.
Quanto ao e / ou declarações pergunta,
e / ou declarações. Este um insetos vivos daylights fora de mim. Eu tentei várias configurações diferentes de
(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...
O que você quer tentar é:
(statement) and: [statement] ifTrue: [ ... ]
Observe os colchetes, o e:. Método leva um bloco como um argumento
Para criar vários inteiros aleatórios entre 1 e 1000
Primeiro crie uma série de números aleatórios. Faça isso apenas uma vez.
Em seguida, crie um novo número aleatório, tomando o próximo número da série. Repita conforme necessário.
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"
Operações lógicas
aBoolean
irá responder a and:
e or:
. Ambos take argumentos bloco .
Aqui está como eles funcionam.
and: alternativeBlock
Se o receptor é verdade, responda o valor de alternativeBlock; caso contrário, responder falsa sem avaliar alternativeBlock.
or: alternativeBlock
Se o receptor é falsa, responda o valor de alternativeBlock; caso contrário resposta verdadeira sem avaliar alternativeBlock.
por exemplo.
( 3 > 2 ) or: [ 3 < 4 ] ifTrue: [ ]
aBoolean and: [ anotherBoolean ] ifFalse: [ ]
No entanto, Squeak e Pharo Smalltalks serão ambos aceitar um argumento entre parênteses ( )
Dolphin Smalltalk não vai, e exige rigorosamente a sintaxe padrão Smalltalk de um argumento bloco.
Outros métodos relacionados:
&
um e que não requer uma praça bracketted (ou seja bloco) argumento
|
um ou que não requer uma praça bracketted (ou seja bloco) argumento
&
e |
trabalho no âmbar, Cuis, Gnu, Pharo, Squeak, VisualAge e VisualWorks Smalltalks.
Squeak Smalltalk também fornece:
and:and: }
and:and:and: }
Estes argumentos bloco tirar várias
and:and:and:and }
or:or: }
or:or:or: }
Estes argumentos bloco tirar várias
or:or:or:or: }