7

特定の範囲内で奇数の乱数を生成する方法..

例: 1 から 6 の範囲の場合.. ランダムな番号は 3 または 1 または 5 です

乱数の生成方法 :

    Random_No = Min + (int)(Math.Random()*((Max-Min)+1))

Java で特定の範囲内でランダムな整数を生成するにはどうすればよいですか? を参照してください。

奇数乱数の生成方法 No :

    Random_No = Min + (int)(Math.Random()*((Max-Min)+1))
    if(Random_No%2 ==0)
    {
          if((Max%2)==0)&&Random_No==Max)
          {
              Random_No = Random_No - 1;  
          }
          else{
              Random_No = Random_No +1;
          }
    }

この関数は、常に 2 を 1 ではなく 3 に変換します。これを、2 を 3 に、場合によっては 1 に変換できる、よりランダムな関数にすることはできますか??

4

10 に答える 10

7

max が包括的であると仮定すると、次のことをお勧めします。

if (Max % 2 == 0) --Max;
if (Min % 2 == 0) ++Min;
Random_No = Min + 2*(int)(Math.random()*((Max-Min)/2+1));

これにより、すべての奇数の間で均等に分配されます。

于 2012-09-26T05:22:37.413 に答える
2

方向にランダム性を含めたい場合は、同じ乱数を使用します。

  int  randomDirection = Min + (int)(Math.Random()*((Max-Min)+1));
  if(randomDirection%2==0) {  // any condition to switch the direction 
      Random_No = Random_No + 1;  
  } else {
      Random_No = Random_No - 1;  
  }
于 2012-09-26T05:21:56.287 に答える
1

実際に使用できる整数から奇数を生成するには、n * 2 + 1乱数を生成し、後で変換を適用します

int num = min / 2 + random.nextInt((max + 1) / 2 - min / 2);
num = num * 2 + 1;

これは、範囲が [1,5] [2,5] [2,6] [1,6] であっても機能します。

于 2012-09-26T07:17:55.737 に答える
1

他の回答がすべて int キャストを使用して乱数を生成するのはなぜだろうか。実数よりも正確なランダムな整数を直接生成しないのはなぜですか?

Random rn = new Random();
if(maximum % 2 == 1) maximum = maximum + 1; // turn right bound to even
if(minimum % 2 == 0) minimum = minimum - 1; // turn left bound to odd
int range = (maximum - minimum + 1) / 2;
int randomNum =  rn.nextInt(range) * 2 + minimum;
于 2012-09-26T05:34:23.273 に答える
1

0 から 6 の間の乱数を生成する代わりに、0 から 5 の間で乱数を生成し、最も近い奇数に切り上げると、完全な分布が得られます (可能性 (1、3、5) ごとに 33%)。

于 2012-09-26T05:21:20.027 に答える
1

そのためには、2 つ目の疑似乱数を生成して 1 を加算または減算する必要があります。

Random_No = Min + (int)(Math.Random()*((Max-Min)+1))
repartitionNumber =(int)(Math.Random()*((2)) // between 0 and 1
if(Random_No%2 ==0)
{
      if(Random_No+1<=Max && Random_No-1>=Min)
      {
          if(repartitionNumber==0)
              Random_No = Random_No + 1; 
          else
              Random_No = Random_No - 1;  
      }
      else if(Random_No+1<=Max)
          Random_No = Random_No + 1;
      else if (Random_No-1>=Min)
          Random_No = Random_No - 1;
}
于 2012-09-26T05:29:05.073 に答える
0

数学的には、最後のステップで切り上げまたは切り捨てを行っても、数値が得られることはありません。代わりに、最初と最後の数字は、他のすべての数字よりも 50% 低い確率で選ばれます。

CrazyCasta または JA のソリューションに固執します。

于 2012-09-26T05:26:14.150 に答える
0

上または下のラウディングがランダムなイプシロンに依存するようにします。

    Random_No = Min + (int)(Math.Random()*((Max-Min)+1))
    if(Random_No%2 ==0)
    {

          if((Max%2)==0)&&Random_No==Max)
          {
              Random_No = Random_No - 1;  
          }
          else{
              epsilon = Math.Random();
              if(epsilon > 0.5)
                  Random_No = Random_No + 1;
              else
                  Random_No = Random_No - 1;
          }
    }
于 2013-05-13T19:37:19.517 に答える
0

Math.random() からの戻り値を浮動小数点数としてチェックするのはどうですか。int 部分が偶数の場合は、浮動部分に基づいて上下に変換します。お気に入り:

Math.random() が xy を返したとします。x が偶数の場合、(y>=0.5)?(x+1):(x-1) を返します

これは少しランダム化されますか?

于 2012-09-26T05:31:09.000 に答える