cucumber flesh

Rを中心としたデータ分析・統計解析らへんの話題をしていくだけ

🍭Rでランダムな文字列や数値を生成する

そんなパッケージや関数を調べてみた。

ランダマイゼーションの手法については闇の深さを感じるので、細かいことや背景の処理はそんなに気にしない。とりあえずランダムっぽく生成してくれれば良い、というゆるふわ系記事。

{random}

CRAN - Package random

まず一つ。パッケージ名からして直球。このパッケージでは、 https://www.random.org/ というWebサービスを利用して、無作為に数値や配列、文字列を生成する。こんな感じ。

library(random)
# 行列で値が返ってくる。生成する数や範囲、起点とする値など細かく指定できる。
#  失敗例↓
randomNumbers(n = 4, min = 1, max = 100, col = 4)
##      V1       V2       V3    V4     V5      V6     V7       V8     V9   
## [1,] "Error:" "Server" "too" "busy" "right" "now," "please" "back" "off"
randomStrings(n          = 5,    len        = 5, 
              digits     = TRUE, upperalpha = TRUE,
              loweralpha = TRUE, unique     = TRUE)
##      V1     
## [1,] "kgcel"
## [2,] "rHgBq"
## [3,] "u8Xpz"
## [4,] "unj1h"
## [5,] "pAUQU"

あんまり使い過ぎると怒られて、値を返してくれなくなる(泣)

{passwordrandom}

[https://github.com/hrbrmstr/passwordrandom:embed:cite]

我らがキャップことBob Rubis作。こちらは [http://www.passwordrandom.com] というWebサービスAPIを利用している。文字列や数値だけでなく、パスワード用の文字と数値を混ぜたものを生成したり、ちょっと高機能。

library(passwordrandom)
# 1文字分のアルファベットを生成。引数fmtにて小文字だけにしたり、大文字と混ぜたりも指定可能
random_chars(count = 3, fmt = "l")
## [1] "k" "r" "k"
random_doubles(count = 5, min = 0, max = 100)
## [1] 79.7890 57.0969 49.6109 18.4357 22.3178
random_ints(2, 0, 100)
## [1] 90 91

{stringi}

[https://cran.r-project.org/web/packages/stringi/index]

文字列操作系のパッケージなので、文字を扱う関数が用意されている。

library(stringi)
stri_rand_lipsum(1)
## [1] "Lorem ipsum dolor sit amet, libero aenean, pharetra dictum magna amet pulvinar etiam. Faucibus nulla sem taciti ligula magnis, duis sollicitudin. Amet auctor dictumst eu ipsum bibendum, condimentum venenatis, interdum augue mollis. Etiam at pellentesque ipsum vel a nulla, volutpat. Eget ac a blandit at quam tristique nascetur accumsan. Purus egestas lacus est vitae duis. Leo, ipsum orci parturient, nullam porttitor vivamus condimentum proin, et. Lorem interdum litora facilisi sed varius. Scelerisque eget pellentesque scelerisque class at egestas."
stri_rand_shuffle(str = "apple")
## [1] "pepla"
stri_rand_strings(n = 2, length = 10)
## [1] "bHivfBL76I" "pzRCxeI7b7"

... 素朴な疑問。乱数固定する際に利用するset.seed()はこれらの関数に対しても有効なのであろうか。

stri_rand_strings(n = 1, length = 5)
## [1] "mMxup"
set.seed(100)
stri_rand_strings(n = 1, 5)
## [1] "JFY3T"
set.seed(100)
stri_rand_strings(n = 1, 5)
## [1] "JFY3T"
stri_rand_strings(n = 1, 5)
## [1] "ToMXA"

おお。きちんと再現されている。なお上つのパッケージでは無理みたい。

まとめ

使い勝手や仕様が微妙に異なってくるので、用途や好みに合わせて選べば良い。

パッケージ 再現性 整数値 小数値 文字列
{random} 🉑 🉑 🉑
{passwordrandom} 🉑 🉑 🉑
{stringi} 🉑 🉑

他にもこんな関数があるよ、という情報をお持ちの方はお知らせしてほしい。

参考