@JunaidAftab It depends on what what works for you. Given any topic you will find tutorials, books, examples etc. because different people prefer to learn in different ways. So it is also with Mathematica... That said, Mathematica Cookbook has a nice mix of language basics and examples. With it you can start doing things very quickly. This site is also nice for that. You can look up things you want to do and study the answers, but you won't find detailed explanations of the basics here.
@happyfish The functions that are in GeneralUtilities change with each version. Using Information, ??, or PrintDefinitions is the only way to get more information about them.
Evaluate Names["GeneralUtilities`*"] to find out which functions are in the GeneralUtilities package.
How peculiar: compare BlockRandom[SeedRandom[42]; RandomReal[1, {20, 2}, WorkingPrecision -> MachinePrecision]] and BlockRandom[SeedRandom[42]; RandomReal[1, {20, 2}, WorkingPrecision -> $MachinePrecision]]. I guess I had wrongly assumed that the second one would return an arbitrary-precision version of the first one.
@J.M. The first number always agrees. But not the rest. I guess the same random bits are utilized in different ways to create random reals in the two cases.
@J.M. @halirutan My guess is that the arbitrary-precision version uses an extra bit (or more?) to round to the desired precision. If SeedRandom[423], then the first numbers differ by 2^-53.
@MichaelE2 I was trying to put in different values for WorkingPrecision, hoping that it would end up using the exact same number of bits as the machine numbers. But I didn't succeed in making the results equal.
@MichaelE2 I like it too. But I cannot take credit for it. It is from @faleichik mathematica.stackexchange.com/a/13256/12 With a rotation angle of 3 (i.e. just below Pi)
@J.M. WorkingPrecision -> $MachinePrecision - Log10[2] gives a list of the same numbers as MachinePrecision. (But with slightly less than precision, unfortunately.)