Как рандомизировать слово, попавшее в текстовый файл - PullRequest
1 голос
/ 14 апреля 2019

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

У меня уже есть слово из текстового файла, которое хранится в массиве символов.

Вот что у меня есть

Я создал метод Shuffle

void Shuffle(string[] chArr)
    {
        //Shuffle
        for (int i = 0; i < chArr.Length; i++)
        {
            string tmp = chArr[i].ToString();
            int r = Random.Range(i, chArr.Length);
            chArr[i] = chArr[r];
            chArr[r] = tmp;

        }
        Debug.Log(chArr);
    }

и используйте его вот так

string temp = textArray[rowsToReadFrom[0]];
        temp = System.Text.RegularExpressions.Regex.Replace(temp, @"\s", "");
        char[] chArr = temp.ToCharArray();

        string s = chArr.ToString();
        string[] ss = new string[] { s };
        Shuffle(ss);

        foreach (char c in chArr)
        {
            testObject clone = Instantiate(prefab.gameObject).GetComponent<testObject>();
            clone.transform.SetParent(container);

            charObjects.Add(clone.Init(c));

            //Debug.Log(c);
        }

Это все еще не рандомизирует то слово, которое я получаю из данных текстового файла.

Editted

Пока вот что я сделал

string temp = textArray[rowsToReadFrom[0]];
        temp = System.Text.RegularExpressions.Regex.Replace(temp, @"\s", "");
        char[] chArr = temp.ToCharArray();

        string charResult = "";
        for(int i = 0; i < chArr.Length; i++)
        {
            int ran = Random.Range(0, chArr.Length);
            charResult += chArr[ran];
        }

        Debug.Log(charResult);

        foreach (char c in charResult)
        {

            testObject clone = Instantiate(prefab.gameObject).GetComponent<testObject>();
            clone.transform.SetParent(container);

            charObjects.Add(clone.Init(c));

            //Debug.Log(c);
        }


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

Ответы [ 3 ]

2 голосов
/ 14 апреля 2019

Я буду использовать Fisher – Yates_shuffle

 public static string Shuffle(string str)
    {
        System.Random random = new System.Random();         
        var array = str.ToCharArray();
        for (int i = 0; i < array.Length; i++)
        {
            int j = random.Next(i, array.Length); 
            char temp = array[i]; 
            array[i] = array[j];
            array[j] = temp;
        }
        return String.Join("", array);
    }

, и для его использования просто сделайте

var f = "hello";

Console.WriteLine(Shuffle(f));
2 голосов
/ 14 апреля 2019

Ваш код просто получает случайные буквы из этого слова, но не исключает дубликаты.Вместо этого вам нужно рандомизировать массив символов и преобразовать его обратно в string

System.Random rnd = new System.Random();
Char[] randomCharArray = chArr.OrderBy(x => rnd.Next()).ToArray();
string charResult = randomCharArray.ToString();

Unity имеет собственную реализацию Random, поэтому убедитесь, что вы используете System.Random

1 голос
/ 14 апреля 2019

проще всего, если вы используете список (пусть назовем его начальным списком) (это может привести к некоторому перегреву производительности из-за сдвигов при удалении, но мне интересно, решит ли это использование связанного списка ...

Вот что вы можете сделать, если вы сделаете, как я сказал:

  1. Заполните список своими словами, символами или любыми данными, которые вы хотите рандомизировать
  2. Создайте другой список или массив для хранения рандомизированных данных в (результате)
  3. , создайте цикл while и проверьте время, в котором ваш первоначальный список содержит Item (count> 0)
  4. , использует Random и Performe rand.Next(0, initialList.Count)
  5. взять элемент в индексе случайного числа и добавить его в список результатов (или заменить свободный слот, если вы используете массив)

    List<string> initial = new List<string>();
    initial.AddRange(data);
    Random rand = new Random();
    List<string> result = new List<string>();
    while (initial.Count > 0) // LINQ: initial.Any() 
    {
        int index = rand.Next(0, initial.Count);
        result.Add(initial[index]);
        initial.RemoveAt(index);
    }
    return result;
    
...