Генератор случайных чисел генерирует одинаковые числа - C#
Формулировка задачи:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
class Rndthread
{
private int RowsA; private int RowsB;
private int ColumsA; private int ColumsB;
private double[,] MatrixA; private double[,] MatrixB;
private int howMuchFlows;
private int NumberOfthread;
static Random WhataNumber = new Random();
Thread RNDThread;
public Rndthread(int name/*имя потока*/, double[,] InputmatrixA/*имя матрицы*/, double[,] InputmatrixB, int m, int n, int k, int amountflow)
{
RowsA = m; RowsB = n;
ColumsA = n; ColumsB = k;
MatrixA = InputmatrixA;
MatrixB = InputmatrixB;
howMuchFlows = amountflow;
NumberOfthread = name;
RNDThread = new Thread(rndfunction);
RNDThread.Priority = ThreadPriority.Highest;
RNDThread.Start();
}
void rndfunction()
{
double[,] mIndex = MatrixA;
int StartColculation = RowsA / howMuchFlows * (NumberOfthread);
int EndColculation = RowsA / howMuchFlows * (NumberOfthread + 1) - 1;
Console.ForegroundColor = ConsoleColor.DarkCyan;
Console.WriteLine("Матрица А - Поток №{0} ведет расчет от {1} строки до {2} строки и имеет в расположении {3} столбцов....", NumberOfthread + 1, StartColculation, EndColculation, ColumsA);
Thread.Sleep(0);
for (int i = StartColculation; i <= EndColculation; i++)
{
for (int j = 0; j < ColumsA; j++)
{
mIndex[i, j] = WhataNumber.Next(-10, 11);
Thread.Sleep(0);
}
}
mIndex = MatrixB;
StartColculation = RowsB / howMuchFlows * (NumberOfthread);
EndColculation = RowsB / howMuchFlows * (NumberOfthread + 1) - 1;
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.WriteLine("Матрица В - Поток №{0} ведет расчет от {1} строки до {2} строки и имеет в расположении {3} столбцов....", NumberOfthread + 1, StartColculation, EndColculation, ColumsB);
Thread.Sleep(0);
for (int i = StartColculation; i <= EndColculation; i++)
{
for (int j = 0; j < ColumsB; j++)
{
mIndex[i, j] = WhataNumber.Next(-10, 11);
Thread.Sleep(0);
}
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Поток №{0} завершил заполнение матрицы случайными числами", NumberOfthread + 1);
}
}Решение задачи: «Генератор случайных чисел генерирует одинаковые числа»
textual
Листинг программы
using System;
using System.Security.Cryptography;
// Cryptographically-strong random number generator
// Source: MSDN Magazine > 2007 > September > .NET Matters: Tales from the CryptoRandom
// Source URL: [url]http://msdn.microsoft.com/en-us/magazine/cc163367.aspx[/url]
// via [url]https://gist.github.com/prettycode/5471944[/url]
// Authors: Stephen Toub & Shawn Farkas
public sealed class CryptoRandom : Random, IDisposable
{
private RNGCryptoServiceProvider cryptoProvider = new RNGCryptoServiceProvider();
private byte[] uint32Buffer = new byte[sizeof(uint)];
/// <summary>
/// An implementation of System.Random used for cryptographically-strong random number generation.
/// </summary>
public CryptoRandom() { }
/// <summary>
/// An implementation of System.Random used for cryptographically-strong random number generation.
/// </summary>
public CryptoRandom(int seedIgnored) { }
/// <summary>
/// Returns a nonnegative random number.
/// </summary>
/// <returns>
/// A 32-bit signed integer greater than or equal to zero and less than <see cref="F:System.Int32.MaxValue"/>.
/// </returns>
public override int Next()
{
cryptoProvider.GetBytes(uint32Buffer);
return BitConverter.ToInt32(uint32Buffer, 0) & 0x7FFFFFFF;
}
/// <summary>
/// Returns a nonnegative random number less than the specified maximum.
/// </summary>
/// <returns>
/// A 32-bit signed integer greater than or equal to zero, and less than <paramref name="maxValue"/>; that is, the range of return values ordinarily includes zero but not <paramref name="maxValue"/>. However, if <paramref name="maxValue"/> equals zero, <paramref name="maxValue"/> is returned.
/// </returns>
/// <param name="maxValue">The exclusive upper bound of the random number to be generated. <paramref name="maxValue"/> must be greater than or equal to zero.</param>
/// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="maxValue"/> is less than zero.</exception>
public override int Next(int maxValue)
{
if (maxValue < 0) throw new ArgumentOutOfRangeException("maxValue");
return Next(0, maxValue);
}
/// <summary>
/// Returns a random number within a specified range.
/// </summary>
/// <returns>
/// A 32-bit signed integer greater than or equal to <paramref name="minValue"/> and less than <paramref name="maxValue"/>; that is, the range of return values includes <paramref name="minValue"/> but not <paramref name="maxValue"/>. If <paramref name="minValue"/> equals <paramref name="maxValue"/>, <paramref name="minValue"/> is returned.
/// </returns>
/// <param name="minValue">The inclusive lower bound of the random number returned.</param>
/// <param name="maxValue">The exclusive upper bound of the random number returned. <paramref name="maxValue"/> must be greater than or equal to <paramref name="minValue"/>.</param>
/// <exception cref="T:System.ArgumentOutOfRangeException"><paramref name="minValue"/> is greater than <paramref name="maxValue"/>.</exception>
public override int Next(int minValue, int maxValue)
{
if (minValue > maxValue) throw new ArgumentOutOfRangeException("minValue");
if (minValue == maxValue) return minValue;
long diff = maxValue - minValue;
long max = (1 + (long)uint.MaxValue);
long remainder = max % diff;
while (true)
{
cryptoProvider.GetBytes(uint32Buffer);
uint rand = BitConverter.ToUInt32(uint32Buffer, 0);
if (rand < max - remainder)
{
return (int)(minValue + (rand % diff));
}
}
}
/// <summary>
/// Returns a random number between 0.0 and 1.0.
/// </summary>
/// <returns>
/// A double-precision floating point number greater than or equal to 0.0, and less than 1.0.
/// </returns>
public override double NextDouble()
{
cryptoProvider.GetBytes(uint32Buffer);
uint rand = BitConverter.ToUInt32(uint32Buffer, 0);
return rand / (1.0 + uint.MaxValue);
}
/// <summary>
/// Fills the elements of a specified array of bytes with random numbers.
/// </summary>
/// <param name="buffer">An array of bytes to contain random numbers.</param>
/// <exception cref="T:System.ArgumentNullException"><paramref name="buffer"/> is null.
public override void NextBytes(byte[] buffer)
{
if (buffer == null) throw new ArgumentNullException("buffer");
cryptoProvider.GetBytes(buffer);
}
public void Dispose()
{
InternalDispose();
}
~CryptoRandom()
{
InternalDispose();
}
void InternalDispose()
{
if (cryptoProvider != null)
{
cryptoProvider.Dispose();
cryptoProvider = null;
}
}
}