質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1853閲覧

Javaの乱数

Yoshikun_0945

総合スコア224

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/09 03:31

#実現したいこと
Javaで乱数(ランダムな数値(整数の正数のみ))を作成したいのですが、対象範囲は連番じゃなきゃダメですか?

##例えば
1・3・5・7・9のように偶数または、奇数のみの数値からランダム数値を1つ選ぶ
1・2・5・8・9のように偶数奇数ごちゃごちゃで最大値から最小値の間が連番でない数値から1つ選ぶ
1~3、25~29というように2つ以上の連番エリアがあり、
例でいうと、1・2・3・25・26・27・28・29の8つの中から1つ選ぶ
ということは出来ますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

質問はjavaに対するものではなくアルゴリズムに対するものであり、どの言語でも同じです。

どの言語でも0~N-1のN種類の整数の疑似一様乱数を発生させる機能は持っていますがそれ以外のパターンの整数乱数を発生させる機能はないと思います。その理由は「それ以外の機能が必要ないから」です。なぜかというと0~N-1までの連続した数値範囲の乱数をさらに別の集合に写像すればどのような集合の乱数にも変換できるからです、その写像方法はアプリケーションによって色々なものが考えられるためアプリケーションプログラマーが考えることになります。

写像方法はいかようにも工夫できますが規則性のないどんな集合へも対応できるのがozwkさんが示されているコードになります。

発生しようとしている乱数のパターンに一定の規則があるならその規則になるような写像を考えればもっと効率よくできます。例えば偶数や奇数というようなパターンであればtetrarailさんがおっしゃるような方法で。

1~3、25~29という2つの連続範囲なら前半が3種類、後半が5種類で合計8種類の値なわけですから0~7までの乱数を発生させそれがxだとすればy = (x < 3) ? (x + 1) : (x - 3 + 25)といった写像を考えると望みのものが得られます。

アルゴリズムには無限の組み合わせが考えられます。システムに備わっているのは最も基本的な機能、もしくはよく使われるパターンのものだけなのでそれ以上のバリエーションは自分でアルゴリズムを考えればどのようなものでも作れますよ。

投稿2016/11/09 07:10

編集2016/11/09 07:13
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

int [] ar = new int[]{1,2,3,25,26,27,28,29}; int i = (arのインデックスの範囲内(0~7)で乱数生成) int r = ar[i];

投稿2016/11/09 03:37

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

その例の範囲内ならできます
他は不明ですが、応用は効くと思います

java

1import java.util.Random; 2public class Ran{ 3 public static void main(String[] args){ 4 5 //Randomクラスのインスタンス化 6 Random rnd = new Random(); 7 8 int ran = (rnd.nextInt(10)*2)+1;//1~19までの奇数 9System.out.println("1~19までの奇数の乱数:"+ran); 10 11 ran = (rnd.nextInt(10)*2);//0~18までの遇数 12System.out.println("0~18までの遇数の乱数:"+ran); 13 14int a=0; 15 16while(a==0){ 17 18ran=rnd.nextInt(29)+1; 19 20if((ran>=1 && ran<=3) || (25<=ran && ran<=29) ){ 21a=1; 22} 23} 24 25System.out.println("1~3、25~29までの乱数:"+ran);//1~3、25~29までの乱数 26 27 28 } 29} 30

投稿2016/11/09 04:10

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問