簡體   English   中英

Java用隨機數制作一個半隨機數組

[英]Java making a semi-random array out of a random number

我一直在努力使這個工作。 我想將1和2加到從1-7隨機生成的數字中,並將其存儲在一個數組中,例如:如果隨機數生成器有3,我希望該數組存儲3、4和5。這是我的代碼:

    byte[] locationGen = new byte[1];
    for(byte i = 0; i < locationGen.length; i++) {
        locationGen[i] = (byte)(Math.random()*7+1);
    }
    byte[] locations = new byte[3];
    locations = (locationGen, locationGen+1, LocationGen+2);

一切都按預期工作,不過locations變量除外,我不知道該怎么辦。

在Java中,您可以使用{}而不是()初始化數組。

您的初始循環沒有意義,因為陣列中只有一個位置。 您可以這樣做:

byte locationGen = (byte)(Math.random()*7+1);
byte[] locations = {locationGen, (byte)(locationGen+1), (byte)(locationGen+2)};

那里要注意的事情:

  1. 在這兩種情況下,我都將3保留在聲明之外。 這是不必要的,並且如果您更改初始化,則將成為維護問題。

  2. 我將錯字固定在第三個條目上(您的LocationGen帶有大寫的L ,Java區分大小寫)。

  3. 因為將int12 )添加到byteint ,所以您需要回退。

我會這樣做,除非您有充分的理由創建一個位置字節數組來存儲您的隨機locationGen字節:

byte locationGen = (byte) (Math.random()*7+1);

byte[] locations = new byte[]{locationGen,  (byte) (locationGen+1), 
(byte)(locationGen+2)};

在您發布的解決方案中,您遇到了錯誤,因為在求和之前未訪問locationGen數組位置(locationGen [0]),這可能就是您出錯的原因。

我認為您沒有使用byte類型的真正動機,而使用byte會使Java代碼不必要地變得復雜。 我建議以下解決方案:

int[] locations = new int[3];
for (int locationGen = (int)(Math.random()*7) + 1, i = 0; i < locations.length; i++)
  locations[i] = locationGen + i;

如果確實需要某個byte ,則在最后一刻將其轉換為該byte

byte locationGen = (byte)(Math.random()*7+1);
byte[] locations = {locationGen[0], (byte)(locationGen[0]+1), (byte)(locationGen[0]+2)};
System.out.println(locations[0] + ":" + locations[1] + ":" +locations[2]);

您的循環沒有多大意義,所以我刪除了它。 Arrayinits使用“ {”和“}”而不是“(”和“)”完成。 最后但並非最不重要的一點是,當您嘗試初始化數組“位置”時缺少一些索引。

我猜您是從Python等其他方面來學習Java的。 在Java中,括號()僅用於操作順序,而不用於列表,元組或其他任何操作。 此外,通用表達式中的逗號運算符是“返回列表中的最后一件事”類型的運算符。 最好用一個例子來解釋:

int i = 1,2,3,4; // same as int i = (1,2,3,4);
System.out.println(i); // prints 4

因此,您的代碼需要遵循以下原則(不確定Java是否最近進行了更改以允許分配這樣的數組):

byte[] locationGen = new byte[1];
for(byte i = 0; i < locationGen.length; i++) {
    locationGen[i] = (byte)(Math.random()*7+1);
}
byte[] locations = {locationGen[0], locationGen[0]+1, LocationGen[0]+2};

另外,如果要合並三個數組,則必須使用另一個循環來完成此操作,例如:

byte[] locationGen = new byte[1];
for(byte i = 0; i < locationGen.length; i++) {
    locationGen[i] = (byte)(Math.random()*7+1);
}
byte[] locations = new byte[locationGen.length*3];
for(int i = 0; i < locationGen.length; ++i) {
    locations[i] = locationGen[i];
    locations[i+locationGen.length] = locationGen[i] + 1;
    locations[i+2*locationGen.length] = locationGen[i] + 2;
}

另外,作為對您的代碼的簡短評論,我看不出有足夠的理由在for循環中使用字節作為計數器。 所有Java數組都由int索引,使用字節可能不會為您節省任何費用。 無論如何,堆棧變量(局部變量)往往至少占用一個int的空間,因此您並沒有節省空間,將其作為嚴格的字節進行操作可能會浪費處理器時間。 只需使用一個int

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM