我之前尝试过发帖,但在编辑了5次问题后,它变得阴天并没有帮助任何人。所以这次我会问得好,所以请考虑帮助(如果你认为这是重复的话,那么对于那些只会让事情变得更糟的老帖子就这样做了)
首先,我想使用C#创建一个非常简单的程序,它将随机显示符合以下所有条件的所有数字:
1.生成的数字必须介于1123和5543之间
2.生成的数字必须只有数字1,2,3,4和5
3.生成的数字不得重复
4.每个号码必须重复其中一个数字(如1146或2627)而不是
当我做了一些数学计算时,我得出的结论是正好有300个数字适合这里。
以下代码完成了部分工作:它生成一个4位数字,只有数字1-5。但还有其他3条规则我不知道如何执行。这是我第一次使用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)
关于Console.WriteLine
的问题,我并不十分关心输出的显示方式。我看到一条建议说明我将数据导出到.txt
文件中,但我所关心的只是一次看到数字,但是分开(通过中断或逗号或双倍间距或彼此之间的任何事情。
我的意思是&#34;随机&#34;在开头不是完全随机;我的意思是在所有完成之前随机抽出300种可能性。
我不关心他们是否有秩序,我可以使用一些在线服务在我做完之后订购它们以便更轻松。
提前致谢,并且只是一个快速的说明,这是不一个家庭作业问题,因为&#34;允许&#34;和&#34;必需&#34;。背景故事与Stack Overflow无关,所以我省略了它。
就像我说的,如果你认为这是重复的,那就不是了。另一篇帖子太乱了。
修改
我再次尝试解决,发现只有60个数字。这就是我做的事情
(这是数学,但我把它放在那里以便理解)
我将4个破折号作为选项的插槽。 _ _ _ _
第一个&#34;插槽&#34;我有五个选项(1-5)所以我写了5.因为必须重复一个数字,所以下一个必须是唯一选项(我之前认为我们仍然有5个选项)。所以有了一个号码,还有4个号码,因为我不能有2个重复的数字。然后最后一个数字只有3个,所以我们在我的&#34;插槽&#34;上查看5,1,4,3。然后我将它们相乘得到总可能性5x1x4x3 = 60总数。
我知道这可能与本网站无关,但我认为有必要知道代码是否正常工作。
再次感谢。
答案 0 :(得分:5)
试试这段代码。它创建一个范围内的所有数字,然后将其洗牌:
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();
现在您可以将每个号码打印到控制台
foreach (var number in numbers)
Console.WriteLine(number);
答案 1 :(得分:2)
Aleks Andreev的回答很棒;这里是一个使用查询语法的专有数值方法,其中所有数字只是应用规则2和4生成(规则1是多余的,3不适用):
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());
顺便说一下,符合指定规则的组合数量为 360 。
答案 2 :(得分:0)
知道要解析的数字范围的最小值和最大值(1123和5543),我会做一个简单的循环并检查此范围内的哪些数字合格并将它们添加到列表中。然后,您可以加扰列表以使其“随机”:
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));
}
顺便说一句,我总共获得360个数字。