Compare commits

...

2 Commits

2 changed files with 25 additions and 11 deletions

View File

@ -6,14 +6,26 @@ This was a test to determine if random numbers follow [Benford's Law](https://en
With One-Hundred-Million samples of random numbers between 0 and 9,999,999,999,999,999, the number of leading digits was the following:
1. 11105630
2. 11110535
3. 11112084
4. 11113667
5. 11120216
6. 11106549
7. 11108623
8. 11114813
9. 11107883
```shell
$ ./benfords-law.exe
2020/11/14 10:24:18 generating numbers...
2020/11/14 10:24:19 18% completed generating and analyzing samples
2020/11/14 10:24:20 37% completed generating and analyzing samples
2020/11/14 10:24:21 56% completed generating and analyzing samples
2020/11/14 10:24:22 75% completed generating and analyzing samples
2020/11/14 10:24:23 93% completed generating and analyzing samples
2020/11/14 10:24:24 done.
1: 1108503 (11.085030%)
2: 1111584 (11.115840%)
3: 1111726 (11.117260%)
4: 1111122 (11.111220%)
5: 1110443 (11.104430%)
6: 1111248 (11.112480%)
7: 1111496 (11.114960%)
8: 1111777 (11.117770%)
9: 1112101 (11.121010%)
Press 'Enter' to continue...
```
This shows that Benford's law only works when the data is not random, such as natural data gathered in real life. This is because natural data is generated following a power law, which is common in nature.

View File

@ -27,7 +27,7 @@ func main() {
for {
<-statusTicker.C
percentCompleted := (currentSample * 100) / numSamples
log.Printf("%d %% completed generating and analyzing samples", percentCompleted)
log.Printf("%d%% completed generating and analyzing samples", percentCompleted)
}
}()
@ -48,7 +48,7 @@ func main() {
// output results
for digitMinusOne, count := range results {
fmt.Printf("%d: %d\n", digitMinusOne+1, count)
fmt.Printf("%d: %d (%f%%)\n", digitMinusOne+1, count, float64(count*100)/float64(numSamples))
}
fmt.Print("Press 'Enter' to continue...")
@ -61,10 +61,12 @@ func generatorWorker(returnChannel chan int) {
}
}
// firstDigit returns the first/leftmost digit of the base10 representation of an integer
func firstDigit(x int) int {
return int(math.Abs(float64(x)) / math.Pow(10, float64(numDigits(x)-1)))
}
// numDigits returns the number of digits
func numDigits(x int) int {
if x == 0 {
return 1