Following on from my little experiment with flipping coins millions of times, I thought that it would be interesting to write the same program in Go for comparison.
func main() { rand.Seed(time.Now().UTC().UnixNano()) var competitionSize, runs int flag.IntVar(&competitionSize, "competitionSize", 10, "The size of each coin tossing competition.") flag.IntVar(&runs, "runs", 10, "The number of runs of the competition") flag.Parse() fmt.Println("heads, tails, flips") for i := 0; i < runs; i++ { countHeads := 0 for j := 0; j < competitionSize; j++ { countHeads += rand.Intn(2) } fmt.Printf("%d, %d, %d\n", countHeads, competitionSize-countHeads, competitionSize) } }
The basic idea of how to write the program is unchanged in this language. The output showed a similar distribution to the C# program.
However, Go has straightforward command line arguments parsing built into the standard library (like Python or Perl). In C#, there are a number of third party libraries that do this that can be installed via NuGet. I went with Command Line Parser.
To use this, I needed to add a class with properties with attributes to describe my expected options:
class Options { // Taken from http://www.bbc.co.uk/news/politics/eu_referendum/results [Option('s', "competitionSize", DefaultValue = 33551983, HelpText = "The size of each coin tossing competition.")] public int CompetitionSize { get; set; } [Option('r', "runs", DefaultValue = 1000, HelpText = "The number of runs of the competition")] public int Runs { get; set; } }
The command line arguments are then parsed in the main method:
var commandLineArgs = new Options(); if (Parser.Default.ParseArguments(args, commandLineArgs)) { var runs = commandLineArgs.Runs; var flips = commandLineArgs.CompetitionSize; ... } else { WriteLine("Unable to parse the command line arguments!"); }
While this is not difficult to understand, it is more complicated than it needs to be and requires quite a bit more typing than in the Go program.
10 runs of the referendum simulation in both programs on Windows 10 with an Intel i7 4500U running at 1.8GHz took 7 seconds for the C# program and 13 seconds for the Go program. I wouldn’t take such simple programs very seriously for drawing conclusions about the relative speed of these languages.
The updated C# program and the complete Go program are on GitHub:
https://github.com/robert-impey/CodingExperiments/blob/master/C-Sharp/CoinFlipsAreRandom/CoinFlipsAreRandom/Program.cs
https://github.com/robert-impey/CodingExperiments/blob/master/Go/coinToss.go