2016-10-10 2 views
2

Я новичок в C#, у меня есть код, который вызывает ту же функцию 3 раза, что возвращает случайное жало. По какой-то причине мой код все время возвращает одну и ту же строку. Пожалуйста помоги.Видя те же результаты от функции, которая возвращает случайную строку

 public static String randomString() 
    { 
     String chars = "QWERTYUIOPASDFGHJKLZXCVBNM"; 
     Random rand = new Random(); 
     String finalstring = null; 

     for (int i = 0; i < 8; i++) 
     { 
      finalstring += chars[rand.Next(0, chars.Length - 1)]; 

     } 
     return finalstring; 

    } 

    public void SecondTest() 
    { 

     Console.WriteLine(Class1.randomString()); 
     Console.WriteLine(Class1.randomString()); 
     Console.WriteLine(Class1.randomString()); 

    } 

Sample наблюдающий Выход: AXCFSDRG AXCFSDRG AXCFSDRG

+0

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

ответ

1

Вы строительство трех отдельных случайных объектов, а не повторное использование один случайный объект (который был бы лучше, практика).

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

1

Основано на этом SO Answer.

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

//Function to get random number 
private static readonly Random random = new Random(); 
private static readonly object syncLock = new object(); 
public static int RandomNumber(int min, int max) 
{ 
    lock(syncLock) { // synchronize 
     return random.Next(min, max); 
    } 
} 
+1

VTC как дубликат является более подходящим, чем копирование пасты существующего ответа. –

-1

Использование RNGCryptoServiceProvider Класс:

https://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider(v=vs.110).aspx

RNGCryptoServiceProvider: generate random numbers in the range [0, randomMax) Посмотрите на

Если вы используете метод расширения в ответ и следующее:

public static String randomString() 
    { 
     String chars = "QWERTYUIOPASDFGHJKLZXCVBNM"; 
     Random rand = new Random(); 
     String finalstring = null; 

     for (int i = 0; i < 8; i++) 
     { 
      finalstring += chars[GenerateRandomNumber(8)]; 

     } 
     return finalstring; 

    } 

    public static int GenerateRandomNumber(int length) 
    { 
     using (var randomNumberGenerator = new RNGCryptoServiceProvider()) 
     { 
      return randomNumberGenerator.GetNextInt32(length); 
     } 
    } 

Результат будет разным каждый раз.

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