我正在try 创建一个可能的组合列表,用于将质数数组中的4个随机 Select 的数字相乘,但无济于事.有什么建议吗?

这是一种相当直接的方法,我觉得我无意中错过了一些东西. 以下是我所听到的:

//Pruning outcome from controlled lists of Prime Numbers
$primes = array(2, 3, 5, 7, 11, 13, 17, 19, 21);

function getUniqueRandomProductsWithNumbers($arr, $n) {
  $seen = array(); // Store seen combinations to avoid duplicates
  $productsWithNumbers = array();

  while (count($productsWithNumbers) < pow(count($arr), $n)) {
    $selected = array_rand($arr, $n); // Get random indexes
    sort($selected); // Sort to ensure order for checking duplicates
    $key = implode(",", $selected); // Create a unique key based on sorted indexes

    if (!isset($seen[$key])) {
      $product = 1;
      $numbers = array();
      foreach ($selected as $i) {
        $product *= $arr[$i];
        $numbers[] = $arr[$i];
      }
      $seen[$key] = true;
      $productsWithNumbers[] = array($numbers, $product);
    }
  }

  return $productsWithNumbers;
}

$uniqueProducts = getUniqueRandomProductsWithNumbers($primes, 4);
echo "Unique Products with Numbers:\n";
foreach ($uniqueProducts as $productSet) {
  echo "Numbers: ";
  print_r($productSet[0]); // Print the numbers array
  echo ", Product: " . $productSet[1] . "\n";
}

真的很感谢你们的指点.提前感谢...

推荐答案

看起来你走上了正确的道路!但是,有几件事需要调整以确保代码正常工作:

  1. Array of Prime Numbers:

    • 在您的$primes数组中,不应该包括数字21,因为21不是质数.将其替换为质数23.
  2. Loop Condition:

    • 您当前的循环条件count($productsWithNumbers) < pow(count($arr), $n)不是最佳状态.这种情况可能并不总是如预期的那样工作,尤其是在处理重复项时.最好对照可能的唯一组合的总数进行判断,它是nCr,其中n$arr中的元素总数,r是您 Select 的元素数.在这种情况下,是nCr(9, 4).
  3. Unique Key for Duplicates:

    • 创建唯一键以判断重复项的方法是不正确地处理排列.当您对所选索引进行排序时,它不会防止重复,因为不同的顺序仍然会创建相同的排序关键字.相反,您可以直接使用排序值本身来判断唯一性.

以下是修改后的代码:

// Pruning outcome from controlled lists of Prime Numbers
$primes = array(2, 3, 5, 7, 11, 13, 17, 19, 23); // Changed 21 to 23

function nCr($n, $r) {
  return factorial($n) / (factorial($r) * factorial($n - $r));
}

function factorial($n) {
  if ($n <= 1) {
    return 1;
  } else {
    return $n * factorial($n - 1);
  }
}

function getUniqueRandomProductsWithNumbers($arr, $n) {
  $totalCombinations = nCr(count($arr), $n);
  $productsWithNumbers = array();

  while (count($productsWithNumbers) < $totalCombinations) {
    $selected = array_rand($arr, $n); // Get random indexes
    sort($selected); // Sort to ensure order for checking duplicates
    $numbers = array_map(function ($i) use ($arr) {
      return $arr[$i];
    }, $selected);

    $product = array_product($numbers);

    if (!in_array($product, $productsWithNumbers)) {
      $productsWithNumbers[] = $product;
      echo "Numbers: ";
      print_r($numbers);
      echo ", Product: " . $product . "\n";
    }
  }

  return $productsWithNumbers;
}

$uniqueProducts = getUniqueRandomProductsWithNumbers($primes, 4);

在此更新的代码中:

  • 我添加了一个nCr函数来计算组合的总数.
  • 将循环条件更改为count($productsWithNumbers) < $totalCombinations.
  • 已卸下$seen数组,并已直接判断产品是否已在$productsWithNumbers中.
  • 删除了不必要的$key变量.

这现在应该生成4个素数及其乘积的唯一组合,而不会有重复.

Php相关问答推荐

当我们使用PHPUnit时,控制台中的--uses param到底起了什么作用以及如何使用?

未找到laravel cascadeOnEdit

自定义WooCommerce查询字符串仅显示前3个产品

FatFreeFramework上的不同路由

使用PHP编码的字符串与使用OpenSSL编写的shell 代码之间的差异

是否重新排序多维数组元素以将所有子数组中的子数组移动到元素列表的底部?

在WooCommerce中添加特定产品类型的百分比费用和固定费用

如何在Laravel Model中自定义多个日期属性的日期格式?

如何按类别过滤自定义帖子类型

htaccess重命名index.php以在URL中显示为SEO的友好名称

execute_query 和prepare+execute 有什么区别?

为什么从一个页面到另一个页面都找不到 JQuery,因为它们使用相同的 twig 模板?

多个产品类别 Select 自定义 WooCommerce 插件设置页面

如何在 PHP laravel 中将图像的透明背景转换为白色?

通过存储库检索 Blade 上的单值数据 出错

注册命名空间后如何获取xml node 值?

Laravel 路由参数中的 ":" 是什么?

如何通过路由传递变量

Laravel - 关联与设置观察者事件的 ID

如何将文件直接上传到 Cloudinary 而不先保存在 public 文件夹中