如何随机化文本文件中的单词
How to randomize the word that been get on the textfile
我想问一下如何随机化从我制作的文本文件数据中获得的单词。
我实际上已经从文本文件中得到了这个词并存储在一个字符数组中。
这是我目前所拥有的
我创建了一个名为 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);
}
但是它不是给我例如 "Abandon" 这个词,而是有时会给我一个随机词 "aaaabn" 谁能帮我看看为什么?
您的代码只是从该单词中获取随机字母,但不排除重复字母。您想要的是随机化字符数组并将其转换回 string
System.Random rnd = new System.Random();
Char[] randomCharArray = chArr.OrderBy(x => rnd.Next()).ToArray();
string charResult = randomCharArray.ToString();
Unity 有自己的 Random
实现,所以一定要使用 System.Random
如果你使用一个列表(我们称之为初始列表),它会更容易,(它可能会导致一些性能过热对删除时的移位,但我想知道使用链表是否可以解决这个问题......
如果你按照我说的去做,你可以做什么:
- 用您的文字、字符或您想要随机化的任何数据填充列表
- 创建另一个列表或数组以将随机数据存储在(结果)
- 创建一个 while 循环,并检查 while,您的初始列表有项目(计数 > 0)
- 使用随机,并执行
rand.Next(0, initialList.Count)
取随机数索引中的项目并将其附加到结果列表中,(如果使用数组,则替换空闲槽)
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;
我将使用 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));
我想问一下如何随机化从我制作的文本文件数据中获得的单词。
我实际上已经从文本文件中得到了这个词并存储在一个字符数组中。
这是我目前所拥有的
我创建了一个名为 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);
}
但是它不是给我例如 "Abandon" 这个词,而是有时会给我一个随机词 "aaaabn" 谁能帮我看看为什么?
您的代码只是从该单词中获取随机字母,但不排除重复字母。您想要的是随机化字符数组并将其转换回 string
System.Random rnd = new System.Random();
Char[] randomCharArray = chArr.OrderBy(x => rnd.Next()).ToArray();
string charResult = randomCharArray.ToString();
Unity 有自己的 Random
实现,所以一定要使用 System.Random
如果你使用一个列表(我们称之为初始列表),它会更容易,(它可能会导致一些性能过热对删除时的移位,但我想知道使用链表是否可以解决这个问题......
如果你按照我说的去做,你可以做什么:
- 用您的文字、字符或您想要随机化的任何数据填充列表
- 创建另一个列表或数组以将随机数据存储在(结果)
- 创建一个 while 循环,并检查 while,您的初始列表有项目(计数 > 0)
- 使用随机,并执行
rand.Next(0, initialList.Count)
取随机数索引中的项目并将其附加到结果列表中,(如果使用数组,则替换空闲槽)
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;
我将使用 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));