2015-12-16 2 views
0

Я программист ex-python, и я попытался изучить «взрослый» язык, который является C#. Но мне нужна помощь с функциями. В Python вы можете написать Funtion, такие какСлучайный ассортимент чисел для переменных

def mainloop: 
    x = random.randint(1,100) 
    print (x) 
    mainloop() 
mainloop() 

и было бы вернуться к FUNTION основного цикла(). Вот код проблемы, над которым я работаю.

public int getValue() 
{ 
    List<int> usedNumbers = new List<int>(); 
    Random rnd = new Random(); 
    int tempValue = rnd.Next(0, 27); 

    if (usedNumbers.Contains(tempValue)) 
    { 
     // Go back to getValue() to have the tempValue get a new value 
    } 
    else 
    { 
     usedNumbers.Add(tempValue); 
     return tempValue; 
    } 
} 
+0

Я не могу определить, какова ваша конечная цель. Вы хотите, чтобы метод просто возвращал случайное число или вы хотите, чтобы метод возвращал случайное число, сохраняя при этом текущую таблицу? – TyCobb

+0

Да, трудно понять, что вы пытаетесь сделать. Дело в том, что 'usedNumbers' не требуется, потому что вы никогда не получите более одного номера этой функции – Leo

ответ

5

кажется, что, на основании подписи, что вы хотите:

private Random rnd = new Random(); 
public int getValue() 
{ 
    return rnd.Next(0, 27); 
} 

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

В этом случае вам нужно это:

private Random rnd = new Random(); 
public IEnumerable<int> getValues() 
{ 
    foreach (var value in Enumerable.Range(0, 26).OrderBy(x => rnd.Next())) 
    { 
     yield return value; 
    } 
} 

Вы можете даже сократить это:

private Random rnd = new Random(); 
public IEnumerable<int> getValues() 
{ 
    return Enumerable.Range(0, 26).OrderBy(x => rnd.Next()); 
} 

Если бы я тогда сделал это:

var x = String.Join(", ", getValues()); 

Я хотел бы получить что-то вроде это:

2, 15, 13, 3, 24, 8, 9, 20, 10, 5, 23, 6, 0, 17, 11, 7, 22, 4, 18, 1, 12, 21, 16, 19 , 25, 14

0

Ваш код рекурсивный, поэтому я немного изменил его, чтобы он работал. Обратите внимание, однако, что решение этого с помощью рекурсии совсем не оптимально и, безусловно, приведет к исключению StackOvrflowException. Решение, предложенное @Enigmativity, - это абсолютно путь. Это больше для того, чтобы юморить вас теоретическим решением, которое следует вашему первоначальному предложению.

Поскольку в вашем коде нет реального состояния остановки, я добавил простой. Рекурсивный вызов прекратится после того, как случайно создание 5 различают Itmes:

public static List<int> getValue(List<int> numbers) 
{ 
    List<int> usedNumbers = numbers; 
    Random rnd = new Random(); 
    int tempValue = rnd.Next(0, 27); 

    if (usedNumbers.Count == 5) 
    { 
     return usedNumbers; 
    } 

    if (usedNumbers.Contains(tempValue)) 
    { 
     return getValue(usedNumbers); 
    } 
    else 
    { 
     usedNumbers.Add(tempValue); 
     return getValue(usedNumbers); 
    } 
} 

Позвольте мне просто подчеркнуть еще раз: это только, чтобы показать, как решить эту проблему с помощью рекурсивного подхода. Реальное мировое решение уже представлено в других ответах.