【问题标题】:Randomize an array while leaving specific elements in place?在保留特定元素的同时随机化一个数组?
【发布时间】:2015-05-02 06:13:27
【问题描述】:

快速提问,我的逻辑中的某些东西没有加起来。基本上我想对数组进行洗牌或随机化,但将特定元素保留在适当的位置。超过 900 的任何东西都应保持在同一位置。这看起来应该可以工作,但显然我错过了一些东西。

public static int[] ShuffleArray(int[] data)
{
    for (int t = 0; t < data.Length; t++)
    {
        int tmp = data[t];
        if (tmp < 900)
        {
            int r;
            do
            {
                r = (int)RandomBetween(t, data.Length);
            } while (r > 900);

            data[t] = data[r];
            data[r] = tmp;
        }
    }

    return data;
}

输入这个:

0,0,1,1,2,2,3,
3,999,4,5,1,999,6,
0,0,1,999,2,2,3,
3,4,4,5,5,6,6,
0,999,1,1,999,999,3,
3,4,4,5,5,6,6,
0,0,1,1,2,2,3,

得到这个:

3,5,6,2,6,1,0,
999,999,3,3,5,999,6,
2,4,999,1,999,2,4,
5,2,0,999,2,1,3,
0,1,5,6,2,0,4,
0,0,4,3,6,0,3,
1,1,5,4,3,1,1,

我以为我用

【问题讨论】:

  • 请标注语言!!!
  • 不知道使用的语言或库,无法验证RandomBetween 返回的值是否大于或等于第一个参数且严格小于第二个参数,但您需要它到。
  • 很抱歉没有标记 C#.. 显然我比我意识到的更累。

标签: c# arrays random shuffle


【解决方案1】:

您的逻辑不正确,因为您使用r 作为索引。


改变这个:

while (r > 900)

到这里:

while (data[r] > 900)

请注意,您的算法本身效率极低。

【讨论】:

  • 哦,好肉汁...我一定比我想象的更累..谢谢你指出了显而易见的..抱歉没有标记语言,不认为这有多大不同案例.. C# 记录在案.. 我敢肯定有很多效率低下,这主要是为了使它工作的第一次通过.. 如果你有时间,我很想看到一个更优化的版本!谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多