【发布时间】:2016-06-19 10:44:41
【问题描述】:
我正在尝试通过更改索引来随机更改数组的元素。没关系。现在的问题是,由于随机总是随机的,我可以得到两个相同的结果。
例如:
星期一:
歌曲 1
歌曲 2
歌曲 3
星期二:
歌曲 2
歌曲 1
歌曲 3
星期三:
歌曲 1
歌曲 2
歌曲 3
等等……
还有来自
的列表星期一
和
星期三
在这种情况下是一样的。我需要控制它,但正如您在代码中看到的那样,一旦我从某一天得到列表,我就打印它。我想把它放在一个数组或元组上并检查该元组是否存在,但我认为它太复杂了。我想也许我可以制作自己的随机函数。但是,我也不确定该解决方案。关于如何解决这种情况的任何想法?谢谢!
这是我目前的代码:
static string[] songs = new string[] { "song1", "song2", "song3" };
static string[] days = new string[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
private static Random random = new Random();
/* Random number between lower and higher, inclusive */
public static int rand(int lower, int higher)
{
int r = lower + (int)(random.Next(0, 2) * (higher - lower));
return r;
}
/* pick M elements from original array. Clone original array so that
7 * we don’t destroy the input. */
public static string[] pickMRandomly()
{
string[] subset = new string[songs.Length];
string[] array = (string[])songs.Clone();
for (int j = 0; j < songs.Length; j++)
{
int index = rand(j, array.Length - 1);
subset[j] = array[index];
array[index] = array[j]; // array[j] is now “dead”
}
return subset;
}
public static void playListCreation()
{
for (int j = 0; j < days.Length; j++)
{
var result =pickMRandomly();
System.Console.WriteLine(days[j]);
foreach (var i in result)
{
System.Console.WriteLine(i + " ");
}
System.Console.WriteLine("/n");
}
}
}
【问题讨论】:
-
我对这个问题有点困惑。是否正在生成重复项?如果您使用 3 首歌曲进行测试,则只有 6 种不同的排列方式和一周中的 7 天,因此您将得到一个副本。您测试的歌曲越多,重复出现的可能性就越小。无论如何,您是在问如何比较两个数组以查看它们是否相同?
-
我不明白这个问题。对于任何长度的歌曲列表,该列表的可能排序数量有限 N。正如前面的评论所指出的,在 N 天后,您可以保证重复一个订单。对于一个显着长度的列表,N 很大,随机重复序列的可能性很小,并且试图避免在 N 天之前重复序列将需要存储所有先前的排列,这可能是很多数据。这真的是你想做的吗?
-
不管怎样,您当然可以改进您现在拥有的代码:无需创建 两个 不同的数组;只需复制原件和shuffle it。此外,由于您无论如何都想要一个非破坏性的随机播放,而不是随机播放字符串引用本身,而是随机播放一组索引,按顺序初始化(即
{ 0, 1, 2, ... })。对索引数组进行洗牌还可以最大限度地减少您需要存储的数据的大小,以便记住最后(最多)N 次洗牌,这样您就可以避免重复顺序。 -
您知道您的
public static int rand(int lower, int higher)方法返回lower或higher吗?它不返回/* Random number between lower and higher, inclusive */。