Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidで指定した範囲の乱数を生成する方法【初心者向けサンプルコード付き】

この記事では、Androidアプリで指定した範囲(最小値〜最大値)の中からランダムな数値を生成する方法を、実際に動作するサンプルコードとともに解説します。ユーザーが入力した最小値と最大値をもとに、ボタンをタップすると乱数が画面に表示されるシンプルなアプリを作成していきます。

乱数生成の基本的な仕組み

Java標準のjava.util.Randomクラスを利用すると、簡単に乱数を生成できます。任意の範囲内の乱数を取得するには、次の式を使います。

output = r.nextInt((max - min) + 1) + min;

nextInt(n)メソッドは「0以上 n 未満」の整数を返します。そのため、(max - min) + 1を引数に渡せば、minからmaxまでの値がすべてカバーされます。最後にminを加算することで、範囲の起点をmin側へずらしているのです。この式はサイコロやくじ引きなど、さまざまな場面で応用できるので覚えておきましょう。

手順1:新しいプロジェクトを作成する

Android Studioを起動し、メニューから [File] → [New Project] を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。

手順2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを記述します。画面には、最小値と最大値を入力する2つのEditText、乱数を生成するButton、結果を表示するTextViewを配置しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_min"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:ems="10"
        android:hint="Minimum"
        android:inputType="number" />

    <EditText
        android:id="@+id/et_max"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/et_min"
        android:layout_centerHorizontal="true"
        android:ems="10"
        android:hint="Maximum"
        android:inputType="number" />

    <Button
        android:id="@+id/btn_generate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/et_max"
        android:layout_centerHorizontal="true"
        android:text="GENERATE" />

    <TextView
        android:id="@+id/tv_output"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/btn_generate"
        android:layout_centerHorizontal="true"
        android:textSize="30sp"
        android:hint="Output"
        android:text="" />

</RelativeLayout>

手順3:MainActivity.javaを実装する

src/MainActivity.java に以下のコードを記述します。ボタンがクリックされると、まず入力欄が空でないことを確認し、そのうえで最大値が最小値より大きい場合のみ乱数を生成してTextViewに表示します。

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    EditText et_min, et_max;
    Button btn_generate;
    TextView tv_output;
    Random r;
    int min, max, output;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        r = new Random();
        et_min = findViewById(R.id.et_min);
        et_max = findViewById(R.id.et_max);
        btn_generate = findViewById(R.id.btn_generate);
        tv_output = findViewById(R.id.tv_output);

        btn_generate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String tempMin = et_min.getText().toString();
                String tempMax = et_max.getText().toString();

                if (!tempMin.equals("") && !tempMax.equals("")) {
                    min = Integer.parseInt(tempMin);
                    max = Integer.parseInt(tempMax);

                    if (max > min) {
                        output = r.nextInt((max - min) + 1) + min;
                        tv_output.setText(String.valueOf(output));
                    }
                }
            }
        });
    }
}

実装のポイント:

  • 入力値に対して空チェックと大小関係のチェックを行っているため、不正な入力でもアプリがクラッシュしません。
  • 古いサポートライブラリ(android.support.v7.app.AppCompatActivity)は非推奨のため、現在のAndroid Studioではandroidx.appcompat.app.AppCompatActivityを使用しましょう。
  • inputType="number"を指定することで、キーボードが数字専用になり、誤入力を防げます。

手順4:AndroidManifest.xmlを確認する

androidManifest.xml には以下のコードを記述します。このアプリはインターネット通信などを行わないため、特別なパーミッションは不要です。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

アプリを実行して動作を確認しよう

それでは、アプリケーションを実行してみましょう。ここでは、実機のAndroidスマートフォンをパソコンに接続しているものとします。Android Studioからアプリを実行するには、プロジェクト内のアクティビティファイルを開き、ツールバーの実行(Run)アイコンをクリックします。表示された選択肢から接続済みのモバイルデバイスを選択すると、端末に以下のような画面が表示されます。

Androidで指定した範囲の乱数を生成する方法【初心者向けサンプルコード付き】

Androidで指定した範囲の乱数を生成する方法【初心者向けサンプルコード付き】

最小値と最大値を入力して「GENERATE」ボタンをタップすると、その範囲内のランダムな整数が画面に表示されます。何度か押してみて、毎回異なる値が出ることや、指定した範囲外の値が出ないことを確認してみてください。乱数の仕組みを理解すれば、ゲームや抽選機能など、応用の幅が大きく広がります。

  1. 【Android開発】Switchウィジェットのスタイルをカスタマイズする方法を徹底解説

    Android Switchウィジェットのスタイルをカスタマイズする方法 このチュートリアルでは、AndroidアプリのSwitch(スイッチ)ウィジェットの見た目を自由にカスタマイズする方法を紹介します。thumb(つまみ)とtrack(レール)に独自のDrawableを指定することで、ON/OFFの状態に応じてデザインが切り替わるオリジナルスイッチを作成できます。 ステップ1:新規プロジェクトを作成する Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目を入力して、新しいプロジェクトを作成しましょう。 ステップ2:レイアウトフ

  2. Androidで電話番号のブロックを解除する方法【標準アプリ・Truecaller対応】

    誰かの連絡先をブロックした経験は、誰にでもあるのではないでしょうか。見知らぬ相手や、関係がこじれてしまった旧知の人など、理由はさまざまです。着信拒否機能のおかげで、私たちは平穏な日常を送ることができます。Androidで電話番号をブロックすると、その番号からの電話もSMSも届かなくなります。 しかし、時間が経つと気持ちが変わることもあります。「話す価値がない」と思っていた相手が、実はそれほど悪い人ではなかったと感じたり、関係を修復するためにもう一度チャンスを与えたいと思ったりすることもあるでしょう。そんなときに必要になるのが「ブロック解除」です。ブロックを解除しない限り、その相手に電話をかけた