2010-03-06 2 views
1

Для части программы мне нужны следующие 2 метода.Array 2 метод произвольно сгенерированный номер

В первом указанном методе будет создано случайное число. , где второй метод будет «вызывать» этот метод для заполнения массива.

Массив имеет макс. количество элементов, дефинированных на 100 (и все случайные сгенерированные числа должны быть между 1-100).

Проблема в том, что я никогда не получаю генерируемые случайные числа. (либо я получаю 100 x одно и то же значение, 3 случайных числа, деленные на 100 макс. элементов массива, или одно и то же значение 100 раз снова).

Проблема должна быть в первом методе, но я не могу понять проблему. Посмотрел на это в течение довольно долгого времени ...

Проблема должна быть с возвратом, потому что она создает случайные сгенерированные числа. Но как я каждый раз возвращаю сгенерированное значение? (метод int должен вызываться с 3 параметрами).

 private int ValidNumber(int[] T, int X, int Range) 
    { 
     for (byte I = 0; I < T.Lenght; I++) 
     { 
      Random RndInt = new Random(); 
      X = RndInt.Next(1, Range+1); 
     } 
     return X; 

    }/*ValidNumber*/ 


    public void FillArray(int[] T, int Range) 
    { 
     for (byte I = 0; I < T.Length; I++) 
     { 
      T[I] = ValidNumber(T, I, Range); 
     } 

    }/*FillArray*/ 

консоли Код:

public void ExecuteProgram() 
    { 
     ClsBereken Ber = new ClsBereken(); 

     //const byte Range = 100; 
     const int Max = 100; 
     int[] T = new int[Max]; 

     Ber.FillArray(T, Max); 
     DisplayArray(T); 

    }/*ExecuteProgram*/ 

    private void DisplayArray(int[] T) 
    { 
     for (byte i = 0; i < T.Length; i++) 
     { 
      Console.Write("{0,4} ", T[i]); 
     } 
     Console.WriteLine(); 
    }/*DisplayArray*/ 

Любая помощь много оценили. С уважением.

ответ

4

Повторно использовать экземпляр Random. ПРИМЕЧАНИЕ Я отредактировал это, чтобы показать прохождение Random экземпляра, но я действительно не уверен, что пытается сделать ValidNumber - это выглядит нравится, как ящики сжигают циклы процессора? Я бы предположил, что вы можете полностью удалить ValidNumber (и просто используйте следующее значение из Random в FillArray), но предположительно вы пытаетесь сделать что-то здесь - я просто не уверен, что!

private int ValidNumber(int[] T, int X, int Range, Random random) 
{ 
    for (byte I = 0; I < T.Lenght; I++) 
    { 
     X = random.Next(1, Range+1); 
    } 
    return X; 

}/*ValidNumber*/ 


public void FillArray(int[] T, int Range) 
{ 
    Random random = new Random(); 
    for (byte I = 0; I < T.Length; I++) 
    { 
     T[I] = ValidNumber(T, I, Range, random); 
    } 

}/*FillArray*/ 

При создании Random, он «затравку», используя системные часы, но это округляется тяжело. Если вы создадите множество Random в узком цикле, все они получат одинаковое «семя», поэтому все они создают одно и то же следующее число.

При необходимости вы можете переместить Random дальше (если у вас есть другие петли) или сделать его static (но если вы это сделаете, вам также нужно будет беспокоиться о синхронизации).

+0

Марк, он _has_ для перемещения случайного экземпляра дальше. Посмотрите на код, используется только последнее значение этого цикла. –

+0

Я вижу, что-то вроде этого должно решить «посев»? Random RndInt = new Random ((int) DateTime.Now.Клещи); Хотя мой массив сохраняет 100 x одного и того же случайного числа. – Nerathas

+0

@Nerathas: DateTime.Ticks все еще слишком медленный и уже используется по умолчанию ctor в вашем коде. Повторно используйте объект Random. –

1

Проблема в том, что вы повторно инициализируете rndint снова и снова.

взять строку:

Random RndInt = new Random(); 

и переместить его в передней части цикла и посмотреть, поможет ли это.

Когда вы инициализируете случайный объект, ему назначается семя (возможно, основанное на времени), и это семя используется для создания серии кажущихся случайными значений. Однако, если вы подключите одно и то же семя к двум случайным объектам, вы получите ту же серию случайных чисел.

Итак, что происходит в вашем коде, вы инициализируете новый случайный объект с семенем и затем запрашиваете первое случайное число в своей серии. Затем вы инициализируете другой случайный объект (даже если он назначен одному и тому же имени, это новый объект), и он получает одно и то же семя, и вы снова запрашиваете первое случайное число в серии. Естественно, вы снова и снова получаете одно и то же случайное число.

0

Вы постоянно создаете новый объект Random. Я боюсь, что это посеяно (рандомизировано) по временной отметке творения. Так как это происходит очень быстро и происходит несколько раз, семя такое же, и это результат вызова RndInt.Next(1, Range+1);.

Кстати, хотя это не является неправильным, в C# .net не распространяться, чтобы начать с заглавной буквы на имена локальных переменных и параметров.

0

Любой алгоритм генерации случайных чисел * не является Действительно random; это просто детерминированный алгоритм, специально разработанный для вывода чисел, которые напоминают случайность. (См. Pseudorandom number generator.) Поскольку алгоритм детерминирован, его вывод полностью зависит от начального значения «семян».

Класс Random в .NET имеет два конструктора: один, который принимает целое число, а другой - без параметров. Это основывает свое семя на текущее время.

Из этой информации может быть, вы можете догадаться, почему создание нового Random экземпляра для каждого значения в результатах массива во всем массиве заполняются с тем же номером: каждый раз, когда вы создаете Random объект в очень небольшой срок , он будет иметь одно и то же начальное значение, что означает, что он будет генерировать идентичный вывод другому объекту Random, построенному в тот же период времени.

Как уже указывал Марк Гравелл, вы должны использовать только один экземпляр Random для генерации последовательности случайных чисел.

* Хорошо, почти любой. Я считаю, что существуют аппаратные реализации генераторов случайных чисел, которые влияют на случайный шум (взятый из окружающей среды) и поэтому могут считаться «по-настоящему» случайными. Считаете ли вы, что эти являются Фактически random зависит от вашего личного определения «случайный» и независимо от того, верите вы, что мы живем в детерминированной вселенной.

0

Вы можете передать Random() семя, но если вы отправите ему тот же самый номер семени, вы получите те же результаты. Способ, которым вы используете его

Random rnd = new Random(); 

Использует автогенерированное семя, основанное на времени. Но вы не можете получить, казалось бы, случайные результаты, если не поспите хотя бы на секунду. (Источник http://msdn.microsoft.com/en-us/library/system.random(VS.71).aspx)

Как уже упоминалось здесь, ваша самая большая проблема заключается в том, что вы продолжаете воссоздавать случайный объект на каждой итерации.

Смежные вопросы