【问题标题】:How to randomize the word that been get on the textfile如何随机化文本文件中的单词
【发布时间】:2019-04-14 08:11:26
【问题描述】:

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

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

这是我目前所拥有的

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

它仍然没有随机化我从文本文件数据中得到的那个词。

已编辑

到目前为止,这就是我所做的

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”有人可以帮我解释为什么吗?

【问题讨论】:

  • @styx 先生,这是另一回事。你看我已经选择了一个单词并将它存储到 chararray 并且这个 chararray 是我想要随机化的
  • 你想从给定的字符串中获取随机字符吗?
  • 在最新版本的 Unity 中,您可以拥有 c# ...您认为您的给定代码是用什么编写的?

标签: c# unity3d game-development


【解决方案1】:

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

    【讨论】:

    • 显然 Unity 有自己的 Random 实现,请确保使用来自 System 的实现
    • 对不起,先生,我是初学者,但我怎样才能在日志上显示呢?
    • 你的方法比我的简单多了:)
    • Debug.Log(charResult, this); this 只是让您另外可以在控制台中单击它,它会显示该日志条目的来源;)
    • @derHugo 这不会产生好的随机结果。根据MSDB OrderBy 将使用稳定的排序并保留那些被赋予相同值的字符的顺序。要将“hello”中的“h”放在最后,“h”需要滚动“false”,其余的滚动“true”。但是结果会是“elloh”,这不是很令人兴奋。
    【解决方案3】:

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

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

    1. 用您的单词、字符或您想要随机化的任何数据填写列表
    2. 创建另一个列表或数组来存储随机数据(结果)
    3. 创建一个 while 循环,并检查 while,您的初始列表 Has Item (count > 0)
    4. 使用随机,并执行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;
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多