【发布时间】:2017-06-30 03:46:18
【问题描述】:
我正在编写一个程序,它读取一个文本文件作为输入,并为用户随机打乱字符串数组。 我编写了一个随机打乱字符串数组的程序,但我想这样做的方式是没有两个相同的元素彼此相邻。
这是一个例子: 原始数组看起来像这样
{1,2,3,4,5,1,2}
洗牌后的数组看起来像这样
{5,3,1,2,4,2,1}
但目前我的程序创建了一个输出数组
{5,1,1,3,2,4,2}
这是我随机打乱元素的代码:
int i;
char s[11][100];
char line[100], t[100];
/*Open the text file*/
FILE *fp;
fp = fopen("players.txt", "r");
/*Read each line and put it into an element in an array.
Each line will be in a seperate element in the array.*/
i=0;
while(fgets(line, 100, fp)!= NULL){
strcpy(s[i], line);
i++;
}
/*Generates a random number stored in j and shuffles the order of the array randomly*/
for(i=1; i<10; i++){
j = rand()%(i+1);
strcpy(t, s[j]);
strcpy(s[j], s[i]);
strcpy(s[i], t);
}
【问题讨论】:
-
更好地使用
std::random_shuffleen.cppreference.com/w/cpp/algorithm/random_shuffle. -
@Shravan40:这在 C 中是不可用的,即使是这样,它也没有实现 OP 正在寻求的限制。
-
你的集合中有多少个重复项?任何给定元素是否有两个以上的重复项?
-
@rici 该程序最初是用来随机打乱字符串的。有4个字,战士,防守者,司机和观察者。目前有3名战士,3名后卫,2名车手和2名手表。当程序随机打乱这些字符串时,有时驱动程序可能位于数组的第 0 个元素中,而另一个驱动程序位于数组的第 1 个元素中,有时如果有意义的话,驱动程序也可能位于数组的第 3 个元素中。跨度>
-
@jonathan:我很确定 OP 代码 是 F-Y shuffle,尽管我通常会朝另一个方向编写它。但这是 nit OPs 的问题:问题是如何在并非所有结果都允许的情况下进行洗牌(可能是无偏见的);具体来说,那些具有两个相邻相等元素的元素。 F-Y(和提议的欺骗)没有解决这个限制。