Skip to content

Commit 4e48b42

Browse files
authored
Merge branch 'master' into master
2 parents fb38f57 + 482c790 commit 4e48b42

File tree

5 files changed

+48
-41
lines changed

5 files changed

+48
-41
lines changed

src/Math-Core-Distribution/PMNormalDistribution.class.st

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,22 @@ Class {
88
#classVars : [
99
'NextRandom'
1010
],
11-
#category : 'Math-Core-Distribution'
11+
#category : #'Math-Core-Distribution'
1212
}
1313

14+
{ #category : #information }
15+
PMNormalDistribution class >> boxMullerTransform [
16+
|v1 v2 w y|
17+
[ v1 := Number random * 2 - 1.
18+
v2 := Number random * 2 - 1.
19+
w := v1 squared + v2 squared.
20+
w > 1 ] whileTrue.
21+
y := (w ln * 2 negated / w) sqrt.
22+
v1 := y * v1.
23+
NextRandom := y * v2.
24+
^v1.
25+
]
26+
1427
{ #category : #information }
1528
PMNormalDistribution class >> distributionName [
1629

@@ -40,22 +53,16 @@ PMNormalDistribution class >> new: aNumber1 sigma: aNumber2 [
4053

4154
{ #category : #information }
4255
PMNormalDistribution class >> random [
43-
"A random value generated from the standard normal distribution N(0,1). Can be used to generate values from any other univariate normal distribution N(mu, sigma): first we generate Z ~ N(0,1) and then, to get X ~ N(mu, sigma), we calculate X = sigma * Z + mu (see #random method)"
44-
45-
| v1 v2 w y |
46-
NextRandom isNil
47-
ifTrue: [ [ v1 := Number random * 2 - 1.
48-
v2 := Number random * 2 - 1.
49-
w := v1 squared + v2 squared.
50-
w > 1 ] whileTrue: [].
51-
y := ( ( w ln * 2 negated) / w) sqrt.
52-
v1 := y * v1.
53-
NextRandom := y * v2.
54-
]
55-
ifFalse:[ v1 :=NextRandom.
56-
NextRandom := nil.
57-
].
58-
^v1
56+
"Answer a random number distributed according to a (0,1) normal distribution."
57+
58+
| v1 |
59+
NextRandom
60+
ifNil: [
61+
62+
v1 := self boxMullerTransform ]
63+
ifNotNil: [ v1 := NextRandom.
64+
NextRandom := nil ].
65+
^ v1
5966
]
6067

6168
{ #category : #information }
@@ -79,10 +86,8 @@ PMNormalDistribution >> distributionValue: aNumber [
7986

8087
{ #category : #initialization }
8188
PMNormalDistribution >> initialize: aNumber1 sigma: aNumber2 [
82-
8389
mu := aNumber1.
84-
sigma := aNumber2.
85-
^self
90+
sigma := aNumber2
8691
]
8792

8893
{ #category : #information }
@@ -99,8 +104,9 @@ PMNormalDistribution >> parameters [
99104

100105
{ #category : #information }
101106
PMNormalDistribution >> random [
102-
"Answer a random number distributed accroding to the receiver."
103-
^self class random * sigma + mu
107+
"Answer a random number distributed according to the receiver."
108+
109+
^ self class random * sigma + mu
104110
]
105111

106112
{ #category : #information }

src/Math-Numerical/Number.extension.st

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,16 @@ Number >> productWithVector: aVector [
7070
]
7171

7272
{ #category : #'*Math-Numerical' }
73-
Number >> random [
74-
"Answers a random number distributed between 0 and the receiver."
75-
^self class random * self
73+
Number class >> random [
74+
"Answers a floating random number between 0 and 1 excluded"
75+
76+
^ PMMitchellMooreGenerator new floatValue
7677
]
7778

7879
{ #category : #'*Math-Numerical' }
79-
Number class >> random [
80-
"Answers a random number between 0 and the receiver."
81-
^ PMMitchellMooreGenerator new floatValue
80+
Number >> random [
81+
"Answers a random number distributed between 0 and the receiver."
82+
^self class random * self
8283
]
8384

8485
{ #category : #'*Math-Numerical' }

src/Math-Numerical/PMCauchyDistribution.class.st

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ PMCauchyDistribution >> distributionValue: aNumber [
5959

6060
{ #category : #initialization }
6161
PMCauchyDistribution >> initialize: aNumber1 scale: aNumber2 [
62-
"Private - Initialize the parameters of the receiver. "
62+
"Initialize the parameters of the receiver. "
63+
6364
mu := aNumber1.
64-
beta := aNumber2.
65-
^self
65+
beta := aNumber2
6666
]
6767

6868
{ #category : #information }

src/Math-Numerical/PMExponentialDistribution.class.st

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ PMExponentialDistribution >> initialize: aNumber [
6666

6767
aNumber > 0
6868
ifFalse: [ self error: 'Illegal distribution parameters' ].
69-
beta := aNumber.
70-
^ self
69+
beta := aNumber
7170
]
7271

7372
{ #category : #information }

src/Math-Numerical/PMFisherTippettDistribution.class.st

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ PMFisherTippettDistribution >> distributionValue: aNumber [
6868

6969
{ #category : #initialization }
7070
PMFisherTippettDistribution >> initialize: aNumber1 scale: aNumber2 [
71-
"Private - Initialize the parameters of the receiver."
72-
aNumber2 > 0
73-
ifFalse: [ self error: 'Illegal distribution parameters'].
71+
"Initialize the parameters of the receiver."
72+
73+
aNumber2 <= 0
74+
ifTrue: [ self error: 'Illegal distribution parameters' ].
7475
alpha := aNumber1.
75-
beta := aNumber2.
76-
^self
76+
beta := aNumber2
7777
]
7878

7979
{ #category : #information }
@@ -104,11 +104,12 @@ PMFisherTippettDistribution >> parameters [
104104

105105
{ #category : #information }
106106
PMFisherTippettDistribution >> random [
107-
"Answer a random number distributed according to the receiver."
107+
"Answer a random number distributed according to the receiver."
108+
108109
| t |
109110
[ t := flatGenerator floatValue ln negated.
110-
t > 0] whileFalse: [].
111-
^t ln negated * beta + alpha
111+
t > 0 ] whileFalse.
112+
^ t ln negated * beta + alpha
112113
]
113114

114115
{ #category : #information }

0 commit comments

Comments
 (0)