C# 生成符合特定标准的所有数字

C# 生成符合特定标准的所有数字,c#,random,integer,C#,Random,Integer,我以前试过发帖,但在编辑了5次问题后,问题变得模糊,对任何人都没有帮助。所以这次我会适当地问,所以请考虑一下帮助(如果你相信这是一个复制品,那么就做一个只会让事情变得更糟的旧帖子) 首先,我想用C#编写一个非常简单的程序,随机显示符合以下所有条件的所有数字: 1.生成的数字必须介于1123和5543之间(含1123和5543) 2.生成的数字必须只有数字1、2、3、4和5 3.生成的编号不得重复 4.每个数字必须有一个重复的数字(如1146或2627中的数字),不得超过一个 当我做一些数学运算时

我以前试过发帖,但在编辑了5次问题后,问题变得模糊,对任何人都没有帮助。所以这次我会适当地问,所以请考虑一下帮助(如果你相信这是一个复制品,那么就做一个只会让事情变得更糟的旧帖子)

首先,我想用C#编写一个非常简单的程序,随机显示符合以下所有条件的所有数字:

1.生成的数字必须介于1123和5543之间(含1123和5543)

2.生成的数字必须只有数字1、2、3、4和5

3.生成的编号不得重复

4.每个数字必须有一个重复的数字(如1146或2627中的数字),不得超过一个

当我做一些数学运算时,我得出结论,这里正好有300个数字

以下代码执行部分作业:它生成一个4位数字,其中只有数字1-5。但我不知道如何执行另外三条规则。这是我第一次使用C#(过去只有VB.Net),所以我不知道如何进一步

var chars = "12345";
var stringChars = new char[4];
var random = new Random();
for (int i = 0; i < stringChars.Length; i++)
{
stringChars[i] = chars[random.Next(chars.Length)];
}
var finalString = new String(stringChars);
Console.WriteLine(finalString)
var chars=“12345”;
var stringChars=新字符[4];
var random=新的random();
for(int i=0;i
关于
Console.WriteLine
,我并不真正关心输出的显示方式。我看到一个建议说我将数据导出到一个
.txt
文件中,但我所关心的是一次看到所有的数字,但它们之间是分开的(通过破折号、逗号或双空格或其他方式)

我一开始所说的“随机”并不是完全随机的;我的意思是在300种可能性中随机选择,直到全部完成

我不在乎它们是否整齐,我可以使用一些在线服务来订购它们,一旦我完成了,让事情变得更容易


提前谢谢,只是一个简短的说明,这不是一个家庭作业问题,因为“允许”和“必需”。后台故事与堆栈溢出无关,所以我省略了它

就像我说的,如果你认为这是一个复制品,它不是。另一个帖子太乱了


编辑:

我再次尝试求解,发现只有60个数字。这就是我所做的

(这是数学,但我放在那里是为了理解)

我放置4个破折号作为选项的插槽_

对于第一个“插槽”,我有五个选项(1-5),所以我写了5个。因为一个数字必须重复,所以下一个数字必须是唯一的选项(我以前以为我们还有5个选项)。所以一个数字出来了,还有4个,因为我不能有2个重复的数字。最后一个数字只有3个,所以我们在我的“插槽”上看5,1,4,3。然后我将它们相乘,得到总数5x1x4x3=60

我理解这在这个网站上可能无关紧要,但我认为有必要知道代码的工作原理



再次感谢。

请尝试此代码。创建一个范围内的所有数字,然后将其洗牌:

var validDigits = new HashSet<char> {'1', '2', '3', '4', '5'};
var numbers = Enumerable.Range(1123, 5543 - 1123 + 1)
    .Where(i => i.ToString().All(c => validDigits.Contains(c))) // only 1, 2, 3, 4, 5
    .Where(i => i.ToString().Distinct().Count() == 3) // only one repeated number
    .OrderBy(x => Guid.NewGuid()) // shuffle numbers
    .ToArray();

试试这个代码。创建一个范围内的所有数字,然后将其洗牌:

var validDigits = new HashSet<char> {'1', '2', '3', '4', '5'};
var numbers = Enumerable.Range(1123, 5543 - 1123 + 1)
    .Where(i => i.ToString().All(c => validDigits.Contains(c))) // only 1, 2, 3, 4, 5
    .Where(i => i.ToString().Distinct().Count() == 3) // only one repeated number
    .OrderBy(x => Guid.NewGuid()) // shuffle numbers
    .ToArray();

亚历克斯·安德列夫的回答很好;这里是一种使用查询语法的专用数字方法,其中所有数字都是通过应用规则2和4生成的(规则1是多余的,规则3不适用):


顺便说一句,符合规定规则的组合数量是360个。

Aleks Andreev的答案很好;这里是一种使用查询语法的专用数字方法,其中所有数字都是通过应用规则2和4生成的(规则1是多余的,规则3不适用):


顺便说一句,符合指定规则的组合数是360。

知道要解析的数字范围(1123和5543)的最小值和最大值,我会做一个简单的循环,检查此范围内的哪些数字符合条件,并将它们添加到列表中。然后,您可以将列表置乱,使其“随机”:

var number=新列表();
对于(var i=1123;id)。其中(d=>d.Count()==2.Count()!=1.
如果(!hasOtherDigit&!有两个以上的相等数字)
{
添加(testNumber);
}
}
var rnd=新随机数();
var-cnt=0;
numbers=numbers.OrderBy(x=>rnd.Next()).ToList();
foreach(数值中的变量编号){
cnt++;
WriteLine(string.Format(“{0}:{1}”,cnt,number));
}

顺便说一下,我总共得到360个数字。

知道要解析的数字范围(1123和5543)的最小值和最大值,我会做一个简单的循环,检查这个范围内的哪些数字符合条件,并将它们添加到列表中。然后,您可以将列表置乱,使其“随机”:

var number=新列表();
对于(var i=1123;id)。其中(d=>d.Count()==2.Count()!=1.
如果(!hasOtherDigit&!有两个以上的相等数字)
{
添加(testNumber);
}
}
var rnd=新随机数();
var-cnt=0;
numbers=numbers.OrderBy(x=>rnd.Next()).ToList();
foreach(数值中的变量编号){
cnt++;
WriteLine(string.Format(“{0}:{1}”,cnt,number));
}

顺便说一句,我总共得到360个数字。

你说程序必须“随机显示所有符合条件的数字”-“随机显示”是什么意思?啊,你回答了这个问题。你真的不需要任何随机行为,你只需要一个合格数字的列表,对吗?坦白说,这里的“不重复”子句就是比特。这意味着没有有效的方法来动态生成它们。考虑到(你说)正好有300个,最合适的做法似乎是简单地生成所有300个,或者:-将它们放在一个列表中,并根据需要从列表中的随机位置取一个(删除该项)-在开始时将它们洗牌,然后把它们放在一个列表/数组/队列/任何东西中,每次(同样,移除项目)都从末尾取300?好像是360度。
private static IEnumerable<int> GenerateValidNumbers()
{
    var validDigits = Enumerable.Range(1, 5);

    return
        from thousands in validDigits
        from hundreds in validDigits
        from tens in validDigits
        from ones in validDigits
        where (new[] { thousands, hundreds, tens, ones}).Distinct()
                                                        .Count() == 3
        select thousands * 1000 + hundreds * 100 + tens * 10 + ones;
}
var rnd = new Random();
var randomSequenceOfNumbers = 
    GenerateValidNumbers().OrderBy(r => rnd.Next());
var numbers = new List<string>();
for (var i = 1123; i <= 5543; i++) {
    var testNumber = i.ToString();
    var hasOtherDigit = testNumber.IndexOfAny(new char[] { '6', '7', '8', '9', '0' }) != -1;
    var hasMoreThanTwoEqualDigits = testNumber.GroupBy(d => d).Where(d => d.Count() == 2).Count() != 1;
    if (!hasOtherDigit && !hasMoreThanTwoEqualDigits)
    {
        numbers.Add(testNumber);
    }
}

var rnd = new Random();
var cnt = 0;
numbers = numbers.OrderBy(x => rnd.Next()).ToList();

foreach (var number in numbers) {
    cnt++;
    Debug.WriteLine(string.Format("{0}: {1}", cnt, number));
}