Pythonで100〜150の範囲からランダムな5つの素数を選んでSeriesを生成する方法
この記事では、Pythonとpandasを使って、100から150までの範囲に含まれる素数の中からランダムに5つを選び出し、pandasのSeriesとして生成するプログラムを紹介します。
解決策
この問題を解くために、以下の手順で進めていきます。
まず、空のリストを定義します。
forループを作成し、範囲を100から150に設定します。
さらに別のforループを使って、2からその数値自体の手前までの値で順番に割り算を行い、約数が存在するかどうかを調べます。約数がひとつも見つからなければ、その数は素数なのでリストに追加します。コードは以下のようになります。
for i in range(100,150):
for j in range(2, i):
if(i % j == 0):
break
else:
l.append(i)
ここでポイントとなるのがPython特有の「for-else」構文です。ループがbreakされずに最後まで完了した場合のみelseブロックが実行されるため、「約数が見つからなかった(=素数である)」という条件を簡潔に表現できます。
次に、randomモジュールのsample関数を使って、素数のリストから5つの値をランダムに抽出し、その結果をもとにSeriesを作成します。
data = rand.sample(l,5) rand_series = pd.Series(data)
実装例
それでは、実際のコード全体を見てみましょう。
import pandas as pd
import random as rand
l = []
for i in range(100,150):
for j in range(2, i):
if(i % j == 0):
break
else:
l.append(i)
data = rand.sample(l,5)
rand_series = pd.Series(data)
print(rand_series)
出力
実行すると、以下のようにインデックス付きのSeriesとして、ランダムに選ばれた5つの素数が出力されます。なお、乱数を使用しているため、実行するたびに出力結果は変わります。
0 109 1 149 2 107 3 101 4 131 dtype: int64
補足:より効率的な素数判定について
上記のコードでは内側のループで2からi-1まですべて確認していますが、約数は平方根以下の範囲に必ず存在するため、range(2, int(i**0.5) + 1)とすることで判定処理を高速化できます。また、mathモジュールのisqrt()関数を使う方法もあります。小さな範囲では差はほとんどありませんが、大きな数値を扱う場合には有効な最適化手法です。
-
指定した範囲内のすべての素数を出力するPythonプログラム
この記事では、以下の問題文に対する解決方法について学んでいきます。 問題文 ある区間が与えられたとき、その範囲内に含まれるすべての素数を求めて出力する必要があります。 ここでは、素数の基本的な定義に基づいた全探索(ブルートフォース)によるアプローチを紹介します。素数とは、「1とその数自身のみを約数として持ち、それ以外の数を約数に持たない自然数」のことです。 この定義に基づき、各数値が素数の条件を満たしているかどうかを判定し、条件が真(True)と評価されるたびに出力処理を行います。 それでは、実際の実装例を見ていきましょう。 実装例 start = 1 end = 37 for val in
-
指定した範囲内の乱数を生成してリストに保存するPythonプログラム
このプログラムでは、3つのユーザー入力変数を使用します。1つ目は乱数の開始値、2つ目は終了値、3つ目は生成して表示する乱数の個数です。 Pythonには乱数を生成するための標準モジュール random が用意されています。本記事では、その中でも指定した範囲内の整数乱数を返す randint() 関数を使用します。randint() は2つの引数(開始値と終了値)を受け取り、両端の値を含む範囲からランダムな整数を1つ返します。 実行例 n :: 10 s :: 20 e :: 40 [20, 35, 32, 27, 24, 35, 28, 31, 20, 28] アルゴリズム Random