c# 随机单个三个数作为一组,不重复之前出现的一组数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 随机单个三个数作为一组,不重复之前出现的一组数据相关的知识,希望对你有一定的参考价值。

比如第一个随机数是1,第二个随机数是1,第三个随机数是1,那么组成一组就是1,1,1。
要求下三个随机数组合起来要和之前的任何一组不重复。

ArrayList al=new ArrayList();
do

产生一组随机数;
if(!al.Contains(你新产生的那组随机数))

al.add(你新产生的那组随机数);


while(al.Contains(你新产生的那组随机数))
参考技术A List<string> arr = new List<string>();
Random rnd = new Random(Guid.NewGuid().GetHashCode());
string s;
do

int a1 = rnd.Next(0, 100);
int a2 = rnd.Next(0, 100);
int a3 = rnd.Next(0, 100);
s = a1 + "," + a2 + "," + a3;
while (arr.Contains(s));
arr.Add(s);

在多个属性上对PHP中的一组对象进行排序[重复]

【中文标题】在多个属性上对PHP中的一组对象进行排序[重复]【英文标题】:sorting an array of objects in PHP on more than one property [duplicate] 【发布时间】:2017-06-09 22:41:57 【问题描述】:

我在这里遇到了一些棘手的情况,需要一些帮助。我在 PHP 中有一组对象,我需要对多个属性进行排序。最终目标是让它们在“停止”项目位于数组末尾的位置进行排序,然后整个数组由 ID 完成。所以 ID 1 会在 2 之前出现,除非 1 被终止,然后 2 会先出现。这是我的数据示例...

$prod = array(
    1 => Product Object (
        [id] => 1
        [title] => "A product"
        [is_discontinued] => 1
    )
    2 => Product Object (
        [id] => 2
        [title] => 'Another Product'
        [is_discontinued] => 0
    )
    3 => Product Object (
        [id] => 3
        [title] => 'Yet another one'
        [is_discontinued] => 0
    )
    ...
)

我最初的想法是在 PHP 中使用内置的“usort”函数,但这并不顺利,因为它使 ID 倒退了。这就是我所做的..

 $prod = usort($prod, function($a) 
    return ($a->is_discontinued) ? 1 : -1;
 );

这行得通,所有停产的产品现在都位于数组的末尾,但它颠倒了 ID 的顺序,所以现在将首先列出 3,然后是 2,然后是 1。我需要它,所以它会被列出依次为 2,然后是 3,然后是 1。由于 2 是非停产的最低 ID,然后是 3,最后是 1,因为它是停产 ID 中的最低值。

我希望我说得通,如果需要的话,我很乐意提供更多代码,我真的需要弄清楚这一点。提前感谢您的任何帮助,非常感谢。

我的问题被标记为重复的问题没有帮助,因为问题是基于 1 个单个值对对象数组进行排序。使用我已经尝试过的解决方案很容易做到这一点,但我需要按一个键和另一个键对它进行排序,这要困难得多。

【问题讨论】:

这可能很混乱,但您可以将数组拆分为两个单独的数组以供使用/停止使用,ksort() 它们,然后将它们组合在一起。这应该使您可以先按他们的键订购,然后再按他们的键订购。 您可以使用array_filter() 删除具有is_discontinuedtrue / 1 的索引,这样循环的其余部分就更容易了。然而,这意味着您暂时必须type juggle 对象。 @Jake 我可能不得不这样做。我试图避免将其拆分,然后将其重新组合在一起,因为我讨厌一个数组有 4 或 5 个 foreach 循环,但我没有看到另一种解决方案。我尝试过的所有东西都只能根据一个属性进行排序,而不是 2。 我已经编辑了“重复项”,以便更清楚地了解如何对多个倍数进行排序 - 您只需要扩展函数即可。我以 PHP 7 的飞船为例,但同样的逻辑也可以应用于 PHP 5 函数。 【参考方案1】:

你仍然可以使用 usort :)

<?php
$array = [
    (object) ['id' => 1, 'title' => 'A product', 'is_discontinued' => 1],
    (object) ['id' => 4, 'title' => 'C product', 'is_discontinued' => 0],
    (object) ['id' => 3, 'title' => 'B product', 'is_discontinued' => 1],
    (object) ['id' => 2, 'title' => 'X product', 'is_discontinued' => 0],
    (object) ['id' => 5, 'title' => 'W product', 'is_discontinued' => 0]
];
print_r($array);

$prod = usort($array, function($a, $b) 
    $c = $a->is_discontinued - $b->is_discontinued;
    $c .= $a->id - $b->id;
    return $c;
);

print_r($array);

工作示例: http://sandbox.onlinephpfunctions.com/code/549f1d5a1afcf983ad34303b80af0968927a62df

【讨论】:

【参考方案2】:

你可以过滤两个数组并合并它们

$prod = array(
    1 =>  array (
        'id' => 1,
        'title' => "A product",
        'is_discontinued' => 1,
    ),
    2 =>  array (
        'id' => 2,
        'title' => 'Another Product',
        'is_discontinued' => 0,
    ),
    3 =>  array (
        'id' => 3,
        'title' => 'Yet another one',
        'is_discontinued' => 0
    )

);

$discontinued = array_filter($prod, function($elem) 
    return $elem['is_discontinued'] ==1;
);

$continued = array_filter($prod, function($elem) 
    return $elem['is_discontinued'] ==0;
);

echo "<pre>";
$new_array=array_merge($continued,$discontinued);
print_r($new_array);

【讨论】:

这似乎成功了,而且在服务器上也不会太难。我主要担心的是,我正在处理一个包含 650 多个对象的数组,并且我不想太用力地推动处理并使页面滞后,但是这种方法似乎不需要太多开销就可以做到。谢谢。 我错过了类型杂耍。否则使用property_exists()

以上是关于c# 随机单个三个数作为一组,不重复之前出现的一组数据的主要内容,如果未能解决你的问题,请参考以下文章

如何向SQLSERVER中进行update一组随机数

如何用c#从一组数中随机抽取数字?

Python:在列表中随机抽取一组无重复元素

C# Random 生成不重复随机数

在多个属性上对PHP中的一组对象进行排序[重复]

js获取一组不重复的随机数的方法