【发布时间】:2014-03-29 05:14:35
【问题描述】:
我想从1 到99 中选择一个随机数。然后再次选择号码,但这次丢弃之前的号码。谁能帮帮我。
【问题讨论】:
-
丢弃之前的号码是不是每次都生成唯一号码?
-
是的,应该从其余数字中选择否。
-
这个我想编写一个叫Housie的游戏
我想从1 到99 中选择一个随机数。然后再次选择号码,但这次丢弃之前的号码。谁能帮帮我。
【问题讨论】:
private List<int> numbers = Enumerable.Range(0, 100).ToList();
private Random rnd = new Random();
public int GetRandomInt()
{
var index = rnd.Next(0, numbers.Length);
var number = numbers[index];
numbers.RemoveAt(index);
return number;
}
【讨论】:
这是我要做的:
var rnd = new Random();
var numbers = new Stack<int>(Enumerable.Range(1, 99).OrderBy(x => rnd.Next()));
您实际上是在随机化数字列表,然后将它们添加到堆栈中。现在您只需执行此操作即可获取每个数字:
var next = numbers.Pop()
当numbers.Count == 0 时你停下来。很简单。
【讨论】:
我通常用数组来做。
每当您创建一个随机数时,只需将其放入数组即可。所以下次通过检查数组来检查数字是否已经生成。
【讨论】:
试试这个
IList<int> arr = Enumerable.Range(1, 99).ToList();
int randNum;
Random rnd = new Random();
randNum = rnd.Next(1, arr.Count());
MessageBox.Show(randNum.ToString());
arr = arr.Where(x => x != randNum).ToList();
【讨论】:
这里是Khanh TO的修改版,因为不正确:
List<int> usedNumbers = new List<int>();
Random rand = new Random(new object().GetHashCode());
int number = 0;
for (int i = 0; i < 99; i++)
{
do
{
number = 1 + rand.Next(0, 99);
} while (usedNumbers.Contains(number));
usedNumbers.Add(number);
}
【讨论】:
我可以选择最短的代码,没有嵌套循环,或者删除列表元素吗?
class Program
{
static Random rnd=new Random();
static void Main(string[] args)
{
var list=new SortedDictionary<double, int>();
// Fill list
for (int i=1; i<=99; i++)
{
list.Add(rnd.NextDouble(), i);
}
// List Automatically random
var random_int=list.Values.ToArray();
// random_int = {45, 7, 72, .. }
}
}
class Program
{
static Random rnd=new Random();
static void Main(string[] args)
{
var list=new int[99];
// Fill list
for (int i=1; i<=99; i++)
{
list[i-1]=i;
}
Comparison<int> any=(x, y) =>
{
var z=2*rnd.NextDouble()-1;
return z.CompareTo(0);
};
// Randomize List
Array.Sort(list, any);
// list = { 49, 59, 21, 7, 18 ...}
}
}
【讨论】: