Автор Amangeldi Anaklychew задал вопрос в разделе Другие языки и технологии
проблема с random() c# и получил лучший ответ
Ответ от ...[гуру]
Потому, что Random не даёт случайные значения, а даёт псевдослучайные (формулой).
Цитата из MSDN:
Начальное значение по умолчанию извлекается из системных часов, которые обладают конечной разрешающей способностью. Вследствие этого различные объекты Random, создаваемые в закрытой последовательности путем вызова конструктора по умолчанию, будут обладать одинаковым начальным значением по умолчанию и, как результат, будут производить идентичные наборы случайных чисел. Эту проблему можно устранить, используя единый объект Random для генерации всех случайных чисел. Можно также обойти его, изменив начальное значение, возвращенное системным часами, а затем явно предоставив это новое начальное значение конструктору Random(Int32). Дополнительные сведения см. в описании конструктора Random(Int32).
Т. к. функция вызывается очень часто и быстро а Вы его каждый раз создаете (new Random) => переинициализируете и генератору нехватает "точности".
Решений 3:
1 - Вынести Random за функции или передавать его как параметр
2 - Генерировать seed вручную
3 - Thread.Sleep (чтобы таймер успел "сдвинуться")
Подробнее:
1:
class Program
{
private static Random t = new Random();
public static int slu(int e, int u)
{
int y = t.Next(e, u + 1);
return y;
}
static void Main()
{
for(int i=0; i<10; i++) {
Console.WriteLine(slu(-3,3));
}
}
}
2:
class Program
{
public static int slu(int e, int u)
{
Random t = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);
int y = t.Next(e, u + 1);
return y;
}
static void Main()
{
for(int i=0; i<10; i++) {
Console.WriteLine(slu(-3,3));
}
}
}
3:
class Program
{
public static int slu(int e, int u)
{
Random t = new Random();
System.Threading.Thread.Sleep(10);
int y = t.Next(e, u + 1);
return y;
}
static void Main()
{
for(int i=0; i<10; i++) {
Console.WriteLine(slu(-3,3));
}
}
}
P.S: Не вижу смысла в функции slu.
...
Просветленный
(44357)
Какой?
Лучше не увлекаться заменой стандартных функий на свои - это приводит к спагетти-коду и к усложненному разбору.
Как сделать Random в C#
Есть три способа (основные в С#):
1ый) это System.Random - его описали выше.
подробнее...
С++ Random(); Random(); Как задать диапазон значений от -100 до 100?
int x = rand() % 201 -
подробнее...
C++ случайные числа
Вкратце:
все генераторы выдают некое количество (множество) значений, и эти значения попадают в
подробнее...
язык программирования Си: Почему ругается на RANDOM и RANDOMIZE? Причем в разных задачах, что не так?
Вот тебе образец
Инициализация генератора случайных чисел.
Синтаксис
подробнее...
Java. Дан массив из 10 int. Наполнить массив случайными числами от -10 до 10.
import java.util.*;
class q95563532 {
public static void main(String[]
подробнее...
как генерировать случайное число в java?
import java.util.Random;
public class Main {
public Main() { }
public static
подробнее...