我有两个数组(实际大小是10倍大):

$names = array(
    'James',
    'John',
    'Robert',
    'Michael',
    'William'
);

$surnames = array(
    'Smith',
    'Johnson',
    'Williams'
);

我需要生成人们的全名。一个人只能有一个名字和一个姓氏全名必须唯一最好的解决办法是什么?
附:我不需要所有可能的名字我认为当不能从给定的数组中生成任何其他唯一的全名时我要破例!
解决方案1:
我想到的第一个…
创建名为full_names的新数组并将生成的名称存储在其中在存储之前,请检查是否已经没有这样的值随机生成。
太慢了又愚蠢。
解决方案2:
在StackOverflow.com上询问生成所有可能的全名的算法然后只要我需要的那么多不,这听起来也很愚蠢。。。

最佳答案

创建一个(i,j)整数双精度数组,覆盖所有可能的姓氏组合洗牌。然后循环遍历数组,并从中逐个取名字。
您将随机获得唯一的全名(前提是您的姓名和姓氏列表不包含重复项)。
编辑
伪代码,根据请求。
首先,执行以下设置步骤:

indexList = emptyList
for i = 1 to length(first_names)
  for j = 1 to length(last_names)
    indexList.push( (i,j) )

shuffle(indexList)

push这里的意思是在列表的末尾添加一个元素。
现在,每次需要新名称时,只需去掉一个索引对indexList,然后从名称数组返回相应的名称:
function getName()
  (i, j) = indexList.pop()
  return concatenate(first_names[i], " ", last_names[j])

pop这里的意思是从列表末尾移除一个元素并返回它。您不太可能有这么多的名字,以至于indexList占用了太多的内存。

09-27 04:51