C# 生成符合特定标准的所有数字
我以前试过发帖,但在编辑了5次问题后,问题变得模糊,对任何人都没有帮助。所以这次我会适当地问,所以请考虑一下帮助(如果你相信这是一个复制品,那么就做一个只会让事情变得更糟的旧帖子) 首先,我想用C#编写一个非常简单的程序,随机显示符合以下所有条件的所有数字: 1.生成的数字必须介于1123和5543之间(含1123和5543) 2.生成的数字必须只有数字1、2、3、4和5 3.生成的编号不得重复 4.每个数字必须有一个重复的数字(如1146或2627中的数字),不得超过一个 当我做一些数学运算时,我得出结论,这里正好有300个数字 以下代码执行部分作业:它生成一个4位数字,其中只有数字1-5。但我不知道如何执行另外三条规则。这是我第一次使用C#(过去只有VB.Net),所以我不知道如何进一步C# 生成符合特定标准的所有数字,c#,random,integer,C#,Random,Integer,我以前试过发帖,但在编辑了5次问题后,问题变得模糊,对任何人都没有帮助。所以这次我会适当地问,所以请考虑一下帮助(如果你相信这是一个复制品,那么就做一个只会让事情变得更糟的旧帖子) 首先,我想用C#编写一个非常简单的程序,随机显示符合以下所有条件的所有数字: 1.生成的数字必须介于1123和5543之间(含1123和5543) 2.生成的数字必须只有数字1、2、3、4和5 3.生成的编号不得重复 4.每个数字必须有一个重复的数字(如1146或2627中的数字),不得超过一个 当我做一些数学运算时
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));
}