我试图为这个场景找到一个有效的随机逻辑算法。哪种编程语言并不重要:假设我有20个元素数组填充了数字
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]从这一点出发,我需要构造每次15大小的数组,但是每次我设置这个新数组中的数字时,剩余的插槽将被来自主数组的随机数填充。例如:在新数组中,必须包含的数字为:1,11,13,20,8,9
因此,新的数组是:
[1,N,N,11,N,20,8,N,9,N,N,N,13,N,N]其中Ns是主数组所有20个元素的随机数。
另一个示例:给定2,18,17,9,5创建新的10个元素数组:
[2,2,18,2,11,17,20,5,5,9]没有重复元素的问题
我想找出一些好的算法。
发布于 2014-07-10 12:01:30
如果您想一次接收一个随机数,并且不想预先创建完整的result数组,那么我的另一个答案是:
requested_number范围内的随机数(其中requested_number是要获取的元素总数)。length(required)之间,则从数组required中打印它,然后从数组中删除它;length(required),因此从optional数组中选择任意随机数。requested_number并重复,直到达到0为止。您需要对2调用random;第一个从total_number - required_number中选择索引,因此您知道从哪个数组中选择一个值,第二次调用optional,以从整个可用范围内选择一个随机数。
这里是C中的一个基本实现(脚注:在mod上使用rand()不能产生一个很好的随机数,但这个示例可以这样做)。
int main()
{
int optional[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };
int required[] = { 21,22,23,24,25 };
int requested_number = 15;
int take_from_required, optional_size, next;
srand(time(NULL));
if (requested_number < sizeof(required)/sizeof(required[0]))
{
printf ("requested number of elements must be at least as large as required array\n");
return EDOM;
}
/* Use this much from 'required': */
take_from_required = sizeof(required)/sizeof(required[0]);
/* Use this much from 'optional': */
optional_size = sizeof(optional)/sizeof(optional[0]);
while (requested_number > 0)
{
/* Please note this is a fairly bad 'random'!
As discussed many times before on SO. */
next = rand() % requested_number;
/* Take from which array? */
if (next >= take_from_required)
{
printf ("%d\n", optional[rand() % optional_size]);
} else
{
printf ("%d (required)\n", required[next]);
required[next] = required[take_from_required-1];
take_from_required--;
}
requested_number--;
}
return 0;
}发布于 2014-07-10 10:09:01
如果我理解正确,这就是问题所在:
optional [ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 ]
required [ 2,18,17,9,5 ]现在构建一个包含至少所有required元素的新数组,并将从optional获取的元素填充到它的容量中。
问题似乎是,您需要从required或optional中取出随机数,同时确保required在末尾是空的。*
创建一个新的数组result (至少需要和required一样长-然后,可以从这个问题中推断出来)。将required的所有元素复制到其中;从optional中用随机元素填充其余元素。
此时,您满足了主要条件,但是required的元素总是首先出现。因此,作为最后一步,对现在存储在result数组中的元素进行洗牌(例如,使用众所周知的费舍-耶茨洗牌)。
*“空”,因为required中的所有数字必须至少使用一次。将它们“从数组中删除”是确保这种情况发生的最简单方法。当(a)可能有任何数字的重复(来自optional和required) 和 (b)是,而不是optional的子集时,事情就变得复杂起来了。
https://stackoverflow.com/questions/24672084
复制相似问题