如何随机化文本文件中获得的单词

问题描述 投票:1回答:3

我想问一下,如何将我从我制作的文本文件数据中获得的单词随机化。

我已经从文本文件中实际获得了这个单词并存储到了一个字符数组中。

这是我到目前为止所拥有的

我创建了一个名为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);
        }


但是,而不是给我一个例子“放弃”这个词,它会给我一个随机的单词“aaaabn”,有人可以帮我解释原因吗?

c# unity3d game-development
3个回答
2
投票

我将使用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
投票

您的代码只是从该单词中获取随机字母,但不排除重复。你想要的是将字符数组随机化并将其转换回string

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

Unity有自己的Random实现,所以一定要使用System.Random


1
投票

如果你使用一个列表(让它称之为初始列表),它会更容易,(它可能会有一些性能过热做移位移除,但我很想知道使用链表是否能解决这个问题......

如果按照我说的做,你可以做什么

  1. 填写列表,包含您的单词,字符或您要随机化的任何数据
  2. 创建另一个列表或数组以存储随机数据(结果)
  3. 创建一个while循环,然后检查,你的初始列表有Item(count> 0)
  4. 使用Random,并执行qazxsw poi
  5. 获取随机数索引中的项目并将其附加到结果列表,(如果使用数组,则替换空闲插槽) rand.Next(0, initialList.Count)
© www.soinside.com 2019 - 2024. All rights reserved.