2012-03-06 2 views
-8

Я знаю, что в сети много вопросов, но я хотел бы знать, почему мой метод не работает Что я делаю неправильно?Уникальный номер в случайном порядке?

public class Generator 
{ 

    private static readonly Random random = new Random(); 

    private static readonly object SyncLock = new object(); 

    public static int GetRandomNumber(int min, int max) 
    { 
     lock (SyncLock) 
     { 
      return random.Next(min, max); 
     } 
    } 

} 


[TestFixture] 
public class Class1 
{ 
    [Test] 
    public void SimpleTest() 
    { 

     var numbers=new List<int>(); 
     for (int i = 1; i < 10000; i++) 
     { 
      var random = Generator.GetRandomNumber(1,10000); 
      numbers.Add(random); 
     } 

     CollectionAssert.AllItemsAreUnique(numbers); 

    } 
} 

РЕДАКТИРОВАТЬ Метод испытания терпит неудачу !! Извините за не упоминая

Спасибо за ваше время и предложения

+4

Неисправности каким образом? –

+0

Что не работает? Это ошибка компилятора? Всегда ли функция возвращает один и тот же номер? – Msonic

+2

@Boo я испугался, когда появился ваш комментарий ...: O – xandercoded

ответ

0
public static void FisherYatesShuffle<T>(T[] array) 
{ 
    Random r = new Random(); 
    for (int i = array.Length - 1; i > 0; i--) 
    { 
     int j = r.Next(0, i + 1); 
     T temp = array[j]; 
     array[j] = array[i]; 
     array[i] = temp; 
    } 
} 

int[] array = new int[10000]; 

for (int i = 0; i < array.Length; i++) array[i] = i; 
FisherYatesShuffle(array); 
+0

@LB это действительно работает. Могу ли я спросить вас, почему Generic? – user9969

+0

@ user231465 просто быть в состоянии перетасовать любой массив, а не только целые массивы –

14

Как вы, возможно, ожидать последовательность 10000 случайных чисел из набора 10000 возможных значений, чтобы быть уникальными, если вы не очень повезло? То, что вы ожидаете, неверно.

Отразить монету дважды. Вы действительно ожидаете, что TH и HT будут единственно возможными последовательностями?

Что заставляет вас думать, что случайные числа должны работать по-другому?

Этот выход из генератора случайных чисел можно:

1, 1, 1, 1, 1, 1, ..., 1 

Так это:

1, 2, 3, 4, 5, 6, ..., 10000 

В самом деле, оба этих последовательностей равновероятны!

+0

Строка '1..10000' содержит 10k уникальных номеров. Почему невозможно? – zerkms

+9

Я сказал «если тебе не очень повезло». – jason

+1

@zerkms - Согласен. Не возможно. Но вы можете быть достаточно уверены, что если вы запустили эту программу раз в секунду на всю жизнь юниверса, вы никогда не получите набор без дубликатов. Это вариант проблемы с днем ​​рождения: http://en.wikipedia.org/wiki/Birthday_problem – perfectionist

2

Случайные! = Уникальный

Дело в том, что ваш код должен моделировать вашу проблему и ваш действительно не делает. Случайное не равно единственному. Если вам нужен уникальный, вам нужно получить свой набор значений и перетасовать их.

Если вам действительно нужны случайные числа, вы не можете ожидать, что они будут уникальными. Если ваш (P) RNG предлагает равномерное распределение, то над многими испытаниями вы должны увидеть одинаковые подсчеты каждого значения (см. Law of Large Numbers). Случаи могут появиться, что кажется «неправильным», но вы не можете уклониться от того, что вы попали в этот случай случайно.

+0

-1 В O (n) могут быть сгенерированы N уникальных чисел. OrderBy будет работать в O (n * log (n)) http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle –

+1

'Guid's гарантированно будет уникальным, но нет никакой гарантии, что они производят значения, достаточные для перетасовки последовательности. Если это тасовка, которую вы хотите, используйте алгоритм перетасовки. – jason

+2

Ирония заключается в том, что ваш ответ нарушает принцип, изложенный в вашем первом предложении. Джейсон прав. ** Гиды являются источником уникальности, а не источником случайности **. Нет никакой гарантии, что вы не получите десять тысяч указаний, которые * уже отсортированы по порядку *; на самом деле, есть некоторые версии алгоритма генерации guid, которые делают именно это. –

2

Вы, кажется, недооцениваете, что класс Random генерирует последовательность уникальной, хотя, по-видимому, случайные числа. Это просто не тот случай; случайность означает, что следующим номером может быть любой возможных вариантов, а не только за исключением одного, что я видел до.

В этом случае совершенно неудивительно, что ваш тест терпит неудачу: вероятность того, что 10000 случайно генерируемых целых чисел (от 1 до 10000 не менее) уникальна, является незначительной.

+0

около 1000? – user9969

0

Я думаю, вы не указали, что ваш метод test не работает.

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

+0

да тест не прошел, и я хотел, чтобы он прошел, чтобы доказать, что я могу генерировать случайные числа Uniquely – user9969

+0

Тогда вам нужно обновить свой код, чтобы получить этот результат. В настоящее время неудача теста - правильный результат. –

+0

ok.I хотел бы обновить код, чтобы получить результат, но я не могу найти, как это сделать? – user9969

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