Clean up project
This commit is contained in:
parent
06d7ff4586
commit
56f3a5ed3a
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
benfords-law
|
||||||
|
benfords-law.exe
|
22
main.go
22
main.go
@ -11,20 +11,22 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
randomMin = 0
|
randomMin = 1 // We specify a range which random numbers will be generated, we must start at the first possible left-most digit
|
||||||
randomMax = 999999999999999999 // int64 max value is 9223372036854775807. We use one digit less than that with all 9's in order to not give bias to any digits.
|
randomMax = 999999999999999999 // int64 max value is 9223372036854775807. We use one digit less than that with all 9's in order to not give bias to any digits.
|
||||||
numSamples = 100000000 // A nice rounded human number
|
numSamples = 100000000 // A nice rounded human number
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
results := [9]int{} // There are 9 possible leading digits and 0 does not count, offset by 1 for index to actual value. Examples: To access 1 use [0]. To access 5 use [4]. To access 9 use [8].
|
// In results, we store a count of each left most leading digits as numbers are randomly genereated
|
||||||
currentSample := 0
|
results := [9]int{} // There are 9 possible leading digits and 0 does not count, offset by 1 for index to actual value. Examples: To access count for 1 use [0]. To access 5 use [4]. To access 9 use [8].
|
||||||
|
currentSample := 0 // A counter that increments each time a random number sample has been generated. Used for status messages
|
||||||
|
|
||||||
|
// Start a little goroutine to output status and attach a ticker to execute it each second
|
||||||
statusTicker := time.NewTicker(time.Second)
|
statusTicker := time.NewTicker(time.Second)
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
<-statusTicker.C
|
<-statusTicker.C // Wait for heartbeat from ticker channel
|
||||||
percentCompleted := (currentSample * 100) / numSamples
|
percentCompleted := (currentSample * 100) / numSamples
|
||||||
log.Printf("%d%% completed generating and analyzing samples", percentCompleted)
|
log.Printf("%d%% completed generating and analyzing samples", percentCompleted)
|
||||||
}
|
}
|
||||||
@ -34,17 +36,19 @@ func main() {
|
|||||||
|
|
||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
for currentSample = 0; currentSample < numSamples; currentSample++ {
|
for currentSample = 0; currentSample < numSamples; currentSample++ {
|
||||||
results[firstDigit(rand.Intn(randomMax-randomMin+1)+randomMin)-1]++ // We must use Intn instead of Int because from Base10's perspective, integers cut off at a really weird spot
|
results[firstDigit(rand.Intn(randomMax-randomMin+1)+randomMin)-1]++ // Generate a random number between randomMin and randomMax, get the first digit then increment the counter in results array, remember, it's offset by 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Done generating and counting digits, stop the status ticker
|
||||||
statusTicker.Stop()
|
statusTicker.Stop()
|
||||||
log.Printf("done.")
|
log.Printf("done.")
|
||||||
|
|
||||||
// output results
|
// Output results
|
||||||
for digitMinusOne, count := range results {
|
for digitMinusOne, digitCount := range results {
|
||||||
fmt.Printf("%d: %d (%f%%)\n", digitMinusOne+1, count, float64(count*100)/float64(numSamples))
|
fmt.Printf("%d: %d (%f%%)\n", digitMinusOne+1, digitCount, float64(digitCount*100)/float64(numSamples))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wait indefinitely until Enter Key is pressed, avoid terminating terminal before viewing results if ran from a shell
|
||||||
fmt.Print("Press 'Enter' to continue...")
|
fmt.Print("Press 'Enter' to continue...")
|
||||||
bufio.NewReader(os.Stdin).ReadBytes('\n')
|
bufio.NewReader(os.Stdin).ReadBytes('\n')
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user