我正在我的不和諧機器人中實作此代碼,我希望能夠在輸入單個命令時生成從 1 到 10 的唯一數字(如上所述)。
事實證明,這些值有時會重復。因此我被建議添加一個陣列(used[])和一個回圈,以便每次檢查該值是否已經生成。
Random random = new Random();
int[] used = new int[10];
int rng = 0;
while (!used.Contains(rng))
{
rng = random.Next(1, 10);
}
/*
I wish to store the generated value "rng" to the "used" array.
e.g.
used[0] = rng
used[1] = rng
used[2] = rng
etc.
*/
Console.WriteLine("The number generated is " Convert.ToString(rng));
但是,我不知道如何按排列順序不斷向陣列添加值。(如上面的評論所見)
以更簡單的方式,我希望系統生成一個數字 10 次,這些數字是從 [1,10] 中隨機挑選出來的,并且只有一次。如果所有數字都生成過一次,則所有數字都可以自由重新生成。
對不起我的錯誤解釋。我用每個人都貢獻的評論對其進行了改進。
uj5u.com熱心網友回復:
這是一個解決方案,它將值打亂并回傳每個值,直到串列用完,然后重新開始:
int[] GenerateNewArray()
{
// Define the values we wish to return
int[] baseValues = new []{1,2,3,4,5,6,7,8,9,10};
Random rnd=new Random();
// Shuffle the array randomly using Linq
return baseValues.OrderBy(x => rnd.Next()).ToArray();
}
void Main()
{
while (true)
{
// Generate a new randomized array
var values = GenerateNewArray();
// Print each value
for (int i=0;i<10;i )
{
Console.WriteLine($"The number generated is {values[i]}");
}
}
}
uj5u.com熱心網友回復:
而不是存盤在陣列中,查找重復項等,只需使用 HashSet 這僅接受唯一值,如果您嘗試添加重復項,它將被簡單地忽略。
或者你可以檢查一下它是否存在
HashSet<int> integerSet = new HashSet<int>();
if (hashSet.Contains(rng ))
// element already exists in set
else
//Doesn't exist
當然,如果您只是繼續隨機生成每個數字,直到您生成了該范圍內的所有內容,那么您還不如簡單地為每個數字生成一個元素陣列/串列,并節省自己的處理時間!
uj5u.com熱心網友回復:
使用串列是一個很好的開始方式,但在繼續評論之前,請查看串列檔案
在閑聊中,串列是您選擇的型別的 IEnumerable,在您宣告和實體化串列的情況下,您應該這樣撰寫List<int> listName = new List<int>();,陣列和串列之間的主要區別在于,您可以隨時填充串列而無需長度宣告,為此您可以添加listName.Add(2);(2:要添加的整數值)或洗掉值listName.Remove(0)(0:需要洗掉的串列的位置,例如:0 是串列中的第一個值,因為位置0 是開始)
Random random = new Random();
List<int> listName = new List<int>();
int rng = 0, counterOfValues = 0;
while (counterOfValues < 10)
{
rng = random.Next(1, 10);
If(!listName.Contains(rng))
{
listName.Add(rng);
Console.WriteLine("The number generated is " listName.Last().ToString());
If(counterOfValues < 10)
{
counterOfValues ;
}
else
{
counterOfValues = 0;
}
}
}
這可能應該完成作業(“應該”,因為這是我寫的一些代碼,所以對 caps ecc 感到抱歉)讓我知道它是否按預期作業或者我們需要更正一些東西!
PS:如果您希望用戶選擇隨機值的范圍,只需更改最小值counterOfValues中的值和10's具有較高值的??值
uj5u.com熱心網友回復:
使用 HashSet 更好地了解您正在使用的數字。但在你的情況下,我認為最好使用 List 并洗掉元素:
var list = new List<int>();
for (int i = 1; i <= 10; i )
list.Add(i);
// List is 0-index
// list = 1 2 3 4 5 6 7 8 9 10
int rng = random.Next(0, list.Count - 1);
// Suppose rgn=3: You get 3 value and remove it from the list
var value = list[rgn];
list.RemoveAt(rgn);
// list = 1 2 4 5 6 7 8 9 10
// Now you get a value between 0...8 (list.Count is 9)
rng = random.Next(0, list.Count - 1);
// Suppose rgn=3: You get 4 value and remove it from the list
var value = list[rgn];
list.RemoveAt(rgn);
// list = 1 2 5 6 7 8 9 10
// Now you get a value between 0...7 (list.Count is 8)
rng = random.Next(0, list.Count - 1);
// Suppose rgn=5: You get 7 value and remove it from the list
var value = list[rgn];
list.RemoveAt(rgn);
// list = 1 2 5 6 8 9 10
...
當串列有一個元素時,您不需要使用亂數。當您的串列為空時,再次填寫并重復整個程序。
在這種形式中,每次隨機呼叫總是會得到一個元素。使用 HashSet,您可能會嘗試大量隨機呼叫來獲取未使用的數字。
一個可能的類:
public class RandomClass
{
private readonly List<int> _list;
private readonly Random _random;
public RandomClass()
{
this._list = new List<int>();
this._random = new Random();
}
private void PopulateList()
{
for (int i = 1; i <= 10; i )
this._list.Add(i);
}
public int GetNumber()
{
if (this._list.Count == 0)
{
this.PopulateList();
}
if (this._list.Count > 1)
{
int rng = this._random.Next(0, this._list.Count);
var value = this._list[rgn];
this._list.RemoveAt(rgn);
return value;
}
else
{
var value = this._list[0];
this._list.RemoveAt(0);
return value;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/444938.html
上一篇:C#按多個不同條件對陣列進行排序
