我怎样才能洗牌
How can I shuffle a list
此代码适用于我在 unity 中创建的游戏。我有一个包含 100 个坐标元素的列表,我想为它们实例化框。盒子的数量应该是 50% 并且完全随机。如果我 运行 我的脚本,我会得到 50% 的框,但按照默认顺序。我的脚本不会随机排列列表中的元素。感谢您的帮助!
// List has 100 elements of coordinates ( x & y)
public List<Vector2> ListPosBoxes = new List<Vector2>();
// Start
void Start()
{
AmountOfBoxes(ListPosBoxes);
}
// Method to display 50% shuffled boxes
void AmountOfBoxes(List<Vector2> list)
{
// Take list -> shuffle -> new list
list = ShuffleList(list);
for (int i = 0; i < list.Count/2; i++)
{
// Create Box
BoxGenerator(list[i]);
}
}
// Method to suffle list
List<Vector2> ShuffleList(List<Vector2> list)
{
Vector2 tmp;
// fisher–yates shuffle
for (int i = list.Count; i < 1; i--)
{
// Pick random Element
int j = Random.Range(0, list.Count);
// Swap Elements
tmp = list[j];
list[j] = list[i - 1];
list[i - 1] = tmp;
}
return list;
}
// Method to create Box
void BoxGenerator(Vector2 box)
{
CreateBox(box.x, box.y);
}
问题是:列表不混。
我认为问题在于您正在尝试重新声明一个参数。
也许开始于:
void AmountOfBoxes(List<Vector2> list)
{
// Take list -> shuffle -> new list
shuffled_list = ShuffleList(list);
for (int i = 0; i < list.Count/2; i++)
{
// Create Box
BoxGenerator(shuffled_list[i]);
}
}
// Method to suffle list
List<Vector2> ShuffleList(List<Vector2> list)
{
Vector2 tmp;
list *= list;
// fisher–yates shuffle
for (int i = list.Count; i < 1; i--)
{
// Pick random Element
int j = Random.Range(0, list.Count);
// Swap Elements
tmp = list[j];
list[j] = list[i - 1];
list[i - 1] = tmp;
}
return list;
}
希望对您有所帮助。
还有什么可以帮助您调试的,那就是在某个地方记录您的变量,以便您知道哪里出了问题。
你是 运行 你的 for-loop from high numbers and decrease i.
// fisher–yates shuffle
for (int i = list.Count; i < 1; i--)
但是 for 循环中的测试是 i smaller than 1
所以它永远不会运行。在 for 循环中放置一个 Debug.Log
来测试和翻转运算符
您实际上有几个错误,如前面的答案所述,但首先,Random.Range(0, list.Count);
实际上是有偏见的,请检查 this link 以更好地理解原因。
这里是更正后的代码:
// fisher–yates shuffle
for (int i = 0; i < list.Count; i++) {
// Pick random Element
int j = Random.Range(i, list.Count);
// Swap Elements
Vector2 tmp = list[i];
list[i] = list[j];
list[j] = tmp;
}
此代码适用于我在 unity 中创建的游戏。我有一个包含 100 个坐标元素的列表,我想为它们实例化框。盒子的数量应该是 50% 并且完全随机。如果我 运行 我的脚本,我会得到 50% 的框,但按照默认顺序。我的脚本不会随机排列列表中的元素。感谢您的帮助!
// List has 100 elements of coordinates ( x & y)
public List<Vector2> ListPosBoxes = new List<Vector2>();
// Start
void Start()
{
AmountOfBoxes(ListPosBoxes);
}
// Method to display 50% shuffled boxes
void AmountOfBoxes(List<Vector2> list)
{
// Take list -> shuffle -> new list
list = ShuffleList(list);
for (int i = 0; i < list.Count/2; i++)
{
// Create Box
BoxGenerator(list[i]);
}
}
// Method to suffle list
List<Vector2> ShuffleList(List<Vector2> list)
{
Vector2 tmp;
// fisher–yates shuffle
for (int i = list.Count; i < 1; i--)
{
// Pick random Element
int j = Random.Range(0, list.Count);
// Swap Elements
tmp = list[j];
list[j] = list[i - 1];
list[i - 1] = tmp;
}
return list;
}
// Method to create Box
void BoxGenerator(Vector2 box)
{
CreateBox(box.x, box.y);
}
问题是:列表不混。
我认为问题在于您正在尝试重新声明一个参数。
也许开始于:
void AmountOfBoxes(List<Vector2> list)
{
// Take list -> shuffle -> new list
shuffled_list = ShuffleList(list);
for (int i = 0; i < list.Count/2; i++)
{
// Create Box
BoxGenerator(shuffled_list[i]);
}
}
// Method to suffle list
List<Vector2> ShuffleList(List<Vector2> list)
{
Vector2 tmp;
list *= list;
// fisher–yates shuffle
for (int i = list.Count; i < 1; i--)
{
// Pick random Element
int j = Random.Range(0, list.Count);
// Swap Elements
tmp = list[j];
list[j] = list[i - 1];
list[i - 1] = tmp;
}
return list;
}
希望对您有所帮助。
还有什么可以帮助您调试的,那就是在某个地方记录您的变量,以便您知道哪里出了问题。
你是 运行 你的 for-loop from high numbers and decrease i.
// fisher–yates shuffle
for (int i = list.Count; i < 1; i--)
但是 for 循环中的测试是 i smaller than 1
所以它永远不会运行。在 for 循环中放置一个 Debug.Log
来测试和翻转运算符
您实际上有几个错误,如前面的答案所述,但首先,Random.Range(0, list.Count);
实际上是有偏见的,请检查 this link 以更好地理解原因。
这里是更正后的代码:
// fisher–yates shuffle
for (int i = 0; i < list.Count; i++) {
// Pick random Element
int j = Random.Range(i, list.Count);
// Swap Elements
Vector2 tmp = list[i];
list[i] = list[j];
list[j] = tmp;
}