diff --git a/Siv3D/include/Siv3D/String.hpp b/Siv3D/include/Siv3D/String.hpp index 362fc68e4..87ef67824 100644 --- a/Siv3D/include/Siv3D/String.hpp +++ b/Siv3D/include/Siv3D/String.hpp @@ -595,6 +595,32 @@ namespace s3d [[nodiscard]] String capitalized()&&; + /// @brief 文字列の要素を 1 つランダムに返します。 + /// @return 文字列からランダムに選ばれた要素への参照 + [[nodiscard]] + value_type& choice(); + + /// @brief 文字列の要素を 1 つランダムに返します。 + /// @return 文字列からランダムに選ばれた要素への参照 + [[nodiscard]] + const value_type& choice() const; + + /// @brief 指定した乱数エンジンを用いて、文字列の要素を 1 つランダムに返します。 + /// @tparam URBG 使用する乱数エンジンの型 + /// @param rbg 使用する乱数エンジン + /// @return 文字列からランダムに選ばれた要素への参照 + SIV3D_CONCEPT_URBG + [[nodiscard]] + value_type& choice(URBG&& rbg); + + /// @brief 指定した乱数エンジンを用いて、文字列の要素を 1 つランダムに返します。 + /// @tparam URBG 使用する乱数エンジンの型 + /// @param rbg 使用する乱数エンジン + /// @return 文字列からランダムに選ばれた要素への参照 + SIV3D_CONCEPT_URBG + [[nodiscard]] + const value_type& choice(URBG&& rbg) const; + /// @brief 指定した値と等しい要素の個数を返します。 /// @param ch 検索する値 /// @return 指定した値と等しい要素の個数 diff --git a/Siv3D/include/Siv3D/detail/String.ipp b/Siv3D/include/Siv3D/detail/String.ipp index c7a641c2e..20e3972df 100644 --- a/Siv3D/include/Siv3D/detail/String.ipp +++ b/Siv3D/include/Siv3D/detail/String.ipp @@ -642,6 +642,32 @@ namespace s3d return std::any_of(m_string.begin(), m_string.end(), f); } + SIV3D_CONCEPT_URBG_ + inline String::value_type& String::choice(URBG&& rbg) + { + const size_t size = m_string.size(); + + if (size == 0) + { + throw std::out_of_range{ "String::choice(): String is empty" }; + } + + return m_string[RandomClosedOpen(0, size, std::forward(rbg))]; + } + + SIV3D_CONCEPT_URBG_ + inline const String::value_type& String::choice(URBG&& rbg) const + { + const size_t size = m_string.size(); + + if (size == 0) + { + throw std::out_of_range{ "String::choice(): String is empty" }; + } + + return m_string[RandomClosedOpen(0, size, std::forward(rbg))]; + } + template >*> inline size_t String::count_if(Fty f) const { diff --git a/Siv3D/src/Siv3D/String/SivString.cpp b/Siv3D/src/Siv3D/String/SivString.cpp index ab5ef279c..d3b01e7db 100644 --- a/Siv3D/src/Siv3D/String/SivString.cpp +++ b/Siv3D/src/Siv3D/String/SivString.cpp @@ -254,6 +254,16 @@ namespace s3d return std::move(*this); } + String::value_type& String::choice() + { + return choice(GetDefaultRNG()); + } + + const String::value_type& String::choice() const + { + return choice(GetDefaultRNG()); + } + size_t String::count(const value_type ch) const noexcept { return std::count(m_string.begin(), m_string.end(), ch);