একটি জেনেরিক পদ্ধতি যা রুবীর মতো 2 পরামিতিগুলির মধ্যে একটি এলোমেলোভাবে পূর্ণসংখ্যা ফেরত দিতে পারে rand(0..n)
।
যেকোনো পরামর্শ?
একটি জেনেরিক পদ্ধতি যা রুবীর মতো 2 পরামিতিগুলির মধ্যে একটি এলোমেলোভাবে পূর্ণসংখ্যা ফেরত দিতে পারে rand(0..n)
।
যেকোনো পরামর্শ?
উত্তর:
আমার পরামর্শটি এ জাতীয় এলোমেলো তৈরির জন্য ইন্ট্রাঞ্জের একটি এক্সটেনশন ফাংশন হবে :(0..10).random()
1.3 হিসাবে, কোটলিন তার নিজস্ব মাল্টি-প্ল্যাটফর্ম র্যান্ডম জেনারেটর নিয়ে আসে। এটি এই কেইপিতে বর্ণিত হয়েছে । নীচের বর্ণিত এক্সটেনশনটি এখন কোটলিন স্ট্যান্ডার্ড লাইব্রেরির অংশ , কেবল এটি এর মতো ব্যবহার করুন:
val rnds = (0..10).random()
1.3 এর আগে, JVM এ আমরা ব্যবহার করি Random
বা ThreadLocalRandom
আমরা JDK> 1.6 এ থাকলেও ।
fun IntRange.random() =
Random().nextInt((endInclusive + 1) - start) + start
এর মতো ব্যবহৃত:
// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
আপনি যদি ফাংশনটি কেবল ফিরে আসতে চান 1, 2, ..., 9
( 10
অন্তর্ভুক্ত নয়) তবে এর সাথে নির্মিত একটি ব্যাপ্তি ব্যবহার করুন until
:
(0 until 10).random()
আপনি যদি জেডিকে> 1.6 এর সাথে কাজ করছেন তবে এর ThreadLocalRandom.current()
পরিবর্তে ব্যবহার করুন Random()
।
কোটলিনজে এবং অন্যান্য বিভিন্নতা
কোটলিন্জ এবং অন্যান্য ব্যবহারের ক্ষেত্রে যা ব্যবহারের অনুমতি দেয় না java.util.Random
, এই বিকল্পটি দেখুন ।
এছাড়াও, আমার পরামর্শের বিভিন্নতার জন্য এই উত্তরটি দেখুন । এটি এলোমেলো Char
এসগুলির জন্য একটি এক্সটেনশন ফাংশনও অন্তর্ভুক্ত করে ।
from
(সমেত) এবং to
(একচেটিয়া) এর মধ্যে একটি এলোমেলো পূর্ণসংখ্যা তৈরি করুন
import java.util.Random
val random = Random()
fun rand(from: Int, to: Int) : Int {
return random.nextInt(to - from) + from
}
Int
গুলি পেতে চান তবে জাভা -8 এর পরিবর্তে আপনি র্যান্ডম # ইন্টি (আকার, থেকে,) ব্যবহার করতে পারেন ।
কোটলিন 1.2 হিসাবে, আপনি লিখতে পারেন:
(1..3).shuffled().last()
এটি সচেতন হোন এটি বড় ও (এন), তবে একটি ছোট তালিকার জন্য (বিশেষত অনন্য মানের) এটি ঠিক আছে: ডি
আপনি এর অনুরূপ একটি এক্সটেনশান ফাংশন তৈরি করতে পারেন java.util.Random.nextInt(int)
যা তার আবদ্ধ IntRange
হওয়ার পরিবর্তে একটি Int
গ্রহণ করে:
fun Random.nextInt(range: IntRange): Int {
return range.start + nextInt(range.last - range.start)
}
আপনি এখন এটি যে কোনও Random
উদাহরণ সহ ব্যবহার করতে পারেন :
val random = Random()
println(random.nextInt(5..9)) // prints 5, 6, 7, or 8
আপনি যদি নিজের নিজস্ব পরিচালনা করতে না চান Random
তবে আপনি কোনও সুবিধাদির পদ্ধতিটি উদাহরণস্বরূপ ব্যবহার করে সংজ্ঞা দিতে পারেন ThreadLocalRandom.current()
:
fun rand(range: IntRange): Int {
return ThreadLocalRandom.current().nextInt(range)
}
প্রথমে Random
নিজের নজির নিজেই ঘোষণা না করে আপনি রুবিতে যেমন এলোমেলো পূর্ণসংখ্যা পেতে পারেন :
rand(5..9) // returns 5, 6, 7, or 8
এলোমেলো অক্ষরের জন্য আমার অন্যান্য উত্তরের সম্ভাব্য পার্থক্য
এলোমেলোভাবে পেতে Char
, আপনি এটির মতো কোনও এক্সটেনশন ফাংশনটি সংজ্ঞায়িত করতে পারেন
fun ClosedRange<Char>.random(): Char =
(Random().nextInt(endInclusive.toInt() + 1 - start.toInt()) + start.toInt()).toChar()
// will return a `Char` between A and Z (incl.)
('A'..'Z').random()
আপনি যদি জেডিকে> 1.6 এর সাথে কাজ করছেন তবে এর ThreadLocalRandom.current()
পরিবর্তে ব্যবহার করুন Random()
।
কোটলিন্জ এবং অন্যান্য ব্যবহারের ক্ষেত্রে যা ব্যবহারের অনুমতি দেয় না java.util.Random
, এই উত্তরটি সাহায্য করবে।
1.3 হিসাবে, কোটলিন তার নিজস্ব মাল্টিপ্লাটফর্ম র্যান্ডম জেনারেটর নিয়ে আসে। এটি এই কেইপিতে বর্ণিত হয়েছে । আপনি এখন এক্সটেনশনটি কোটলিন স্ট্যান্ডার্ড লাইব্রেরির কোনও অংশ হিসাবে না দিয়ে সরাসরি ব্যবহার করতে পারেন:
('a'..'b').random()
@ S1m0nw1 চমত্কার উত্তর বন্ধ করে আমি নিম্নলিখিত পরিবর্তনগুলি করেছি।
কোড:
private object RandomRangeSingleton : Random()
fun ClosedRange<Int>.random() = RandomRangeSingleton.nextInt((endInclusive + 1) - start) + start
পরীক্ষা ক্ষেত্রে:
fun testRandom() {
Assert.assertTrue(
(0..1000).all {
(0..5).contains((0..5).random())
}
)
Assert.assertTrue(
(0..1000).all {
(0..4).contains((0 until 5).random())
}
)
Assert.assertFalse(
(0..1000).all {
(0..4).contains((0..5).random())
}
)
}
পরিসীমা এলোমেলো উদাহরণ [1, 10]
val random1 = (0..10).shuffled().last()
বা জাভা র্যান্ডম ব্যবহার
val random2 = Random().nextInt(10) + 1
1.3 হিসাবে, স্ট্যান্ডার্ড লাইব্রেরিটি এলোমেলো জন্য বহু-প্ল্যাটফর্ম সমর্থন সরবরাহ করেছে, এই উত্তরটি দেখুন।
আপনি যদি কোটলিন জাভাস্ক্রিপ্ট নিয়ে কাজ করছেন এবং এতে অ্যাক্সেস না পেয়ে থাকেন java.util.Random
তবে নিম্নলিখিতগুলি কাজ করবে:
fun IntRange.random() = (Math.random() * ((endInclusive + 1) - start) + start).toInt()
এর মতো ব্যবহৃত:
// will return an `Int` between 0 and 10 (incl.)
(0..10).random()
S1m0nw1 এর উত্তর কার্যকর করার আরেকটি উপায় হ'ল এটি একটি ভেরিয়েবলের মাধ্যমে অ্যাক্সেস করা। এটি আরও কার্যকর নয় তবে এটি () টাইপ করা থেকে বাঁচায়।
val ClosedRange<Int>.random: Int
get() = Random().nextInt((endInclusive + 1) - start) + start
এবং এখন এটি যেমন অ্যাক্সেস করা যেতে পারে
(1..10).random
এমন কোনও মানক পদ্ধতি নেই যা এটি করে তবে আপনি সহজেই নিজের তৈরি করতে পারেন হয় হয় Math.random()
বা ক্লাসটি ব্যবহার করে java.util.Random
। Math.random()
পদ্ধতিটি ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হল :
fun random(n: Int) = (Math.random() * n).toInt()
fun random(from: Int, to: Int) = (Math.random() * (to - from) + from).toInt()
fun random(pair: Pair<Int, Int>) = random(pair.first, pair.second)
fun main(args: Array<String>) {
val n = 10
val rand1 = random(n)
val rand2 = random(5, n)
val rand3 = random(5 to n)
println(List(10) { random(n) })
println(List(10) { random(5 to n) })
}
এটি একটি নমুনা আউটপুট:
[9, 8, 1, 7, 5, 6, 9, 8, 1, 9]
[5, 8, 9, 7, 6, 6, 8, 6, 7, 9]
কোটলিন স্ট্যান্ডার্ড লাইব র্যান্ডম নম্বর জেনারেটর এপিআই সরবরাহ করে না। আপনি যদি কোনও মাল্টিপ্লাটফর্ম প্রকল্পে না থাকেন তবে প্ল্যাটফর্ম এপিআই ব্যবহার করা ভাল (এই সমাধান সম্পর্কে প্রশ্নের বাক্সের সমস্ত উত্তর) ।
তবে আপনি যদি একাধিক প্ল্যাটফর্মের প্রসঙ্গে থাকেন তবে প্ল্যাটফর্মগুলির মধ্যে একই র্যান্ডম সংখ্যার জেনারেটর ভাগ করে নেওয়ার জন্য খাঁটি কোটলিনে নিজের দ্বারা এলোমেলোভাবে প্রয়োগ করা ভাল সমাধান। এটি দেব এবং পরীক্ষার জন্য আরও সহজ।
আমার ব্যক্তিগত প্রকল্পে এই সমস্যার উত্তর দেওয়ার জন্য, আমি একটি খাঁটি কোটলিন লিনিয়ার ক্রেগ্রুভেনিয়াল জেনারেটর প্রয়োগ করি । এলসিজি হ'ল ব্যবহৃত অ্যালগরিদম java.util.Random
। আপনি যদি এটি ব্যবহার করতে চান তবে এই লিঙ্কটি অনুসরণ করুন:
https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4
আপনার জন্য আমার বাস্তবায়ন উদ্দেশ্য nextInt(range: IntRange)
;)।
আমার উদ্দেশ্য সম্পর্কে যত্ন নিন, এলসিজি বেশিরভাগ ব্যবহারের ক্ষেত্রে (সিমুলেশন, গেমস ইত্যাদি) জন্য ভাল তবে এই পদ্ধতির পূর্বাভাসের কারণে ক্রিপ্টোগ্রাফিকভাবে ব্যবহারের জন্য উপযুক্ত নয়।
আপনি যে নম্বরগুলি থেকে নির্বাচন করতে চান তা যদি ধারাবাহিক না হয় তবে আপনি ব্যবহার করতে পারেন random()
।
ব্যবহার:
val list = listOf(3, 1, 4, 5)
val number = list.random()
তালিকায় থাকা একটি নম্বর প্রদান করে।
একটি শীর্ষ-স্তরের ফাংশন ব্যবহার করে, আপনি রুবির মতো (যেমন আপনি চান) ঠিক একই কল সিনট্যাক্স অর্জন করতে পারেন:
fun rand(s: Int, e: Int) = Random.nextInt(s, e + 1)
ব্যবহার:
rand(1, 3) // returns either 1, 2 or 3
প্রথমত, আপনার একটি আরএনজি দরকার। কোটলিনে আপনাকে বর্তমানে প্ল্যাটফর্মটি নির্দিষ্ট ব্যবহার করতে হবে (একটিতে কোনও কোটলিন অন্তর্নির্মিত নেই)। জেভিএম এর জন্য এটি java.util.Random
। আপনার এটির একটি উদাহরণ তৈরি করতে হবে এবং তারপরে কল করতে হবে random.nextInt(n)
।
কোটলিনে একটি এলোমেলো নম্বর পেতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন :
import java.util.concurrent.ThreadLocalRandom
fun randomInt(rangeFirstNum:Int, rangeLastNum:Int) {
val randomInteger = ThreadLocalRandom.current().nextInt(rangeFirstNum,rangeLastNum)
println(randomInteger)
}
fun main() {
randomInt(1,10)
}
// Result – random Int numbers from 1 to 9
আশাকরি এটা সাহায্য করবে.
আপনি একটি এক্সটেনশন ফাংশন তৈরি করতে পারেন:
infix fun ClosedRange<Float>.step(step: Float): Iterable<Float> {
require(start.isFinite())
require(endInclusive.isFinite())
require(step.round() > 0.0) { "Step must be positive, was: $step." }
require(start != endInclusive) { "Start and endInclusive must not be the same"}
if (endInclusive > start) {
return generateSequence(start) { previous ->
if (previous == Float.POSITIVE_INFINITY) return@generateSequence null
val next = previous + step.round()
if (next > endInclusive) null else next.round()
}.asIterable()
}
return generateSequence(start) { previous ->
if (previous == Float.NEGATIVE_INFINITY) return@generateSequence null
val next = previous - step.round()
if (next < endInclusive) null else next.round()
}.asIterable()
}
রাউন্ড ফ্লোট মান:
fun Float.round(decimals: Int = DIGITS): Float {
var multiplier = 1.0f
repeat(decimals) { multiplier *= 10 }
return round(this * multiplier) / multiplier
}
পদ্ধতির ব্যবহার:
(0.0f .. 1.0f).step(.1f).forEach { System.out.println("value: $it") }
আউটপুট:
মান: 0.0 মান: 0.1 মান: 0.2 মান: 0.3 মান: 0.4 মান: 0.5 মান: 0.6 মান: 0.7 মান: 0.8 মান: 0.9 মান: 1.0
সম্পূর্ণ উত্স কোড। সদৃশ অনুমোদিত কিনা তা নিয়ন্ত্রণ করতে পারে।
import kotlin.math.min
abstract class Random {
companion object {
fun string(length: Int, isUnique: Boolean = false): String {
if (0 == length) return ""
val alphabet: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9') // Add your set here.
if (isUnique) {
val limit = min(length, alphabet.count())
val set = mutableSetOf<Char>()
do { set.add(alphabet.random()) } while (set.count() != limit)
return set.joinToString("")
}
return List(length) { alphabet.random() }.joinToString("")
}
fun alphabet(length: Int, isUnique: Boolean = false): String {
if (0 == length) return ""
val alphabet = ('A'..'Z')
if (isUnique) {
val limit = min(length, alphabet.count())
val set = mutableSetOf<Char>()
do { set.add(alphabet.random()) } while (set.count() != limit)
return set.joinToString("")
}
return List(length) { alphabet.random() }.joinToString("")
}
}
}
যখনই এমন কোনও পরিস্থিতি তৈরি হয় যখন আপনি কী বা ম্যাক ঠিকানা তৈরি করতে চান যা ব্যবহারকারীর চাহিদার ভিত্তিতে ডিজিটযুক্ত হেক্সাডেসিমাল সংখ্যা এবং এটিও অ্যান্ড্রয়েড এবং কোটলিন ব্যবহার করে থাকে, তারপরে আপনি আমার নীচের কোডটি আপনাকে সহায়তা করে:
private fun getRandomHexString(random: SecureRandom, numOfCharsToBePresentInTheHexString: Int): String {
val sb = StringBuilder()
while (sb.length < numOfCharsToBePresentInTheHexString) {
val randomNumber = random.nextInt()
val number = String.format("%08X", randomNumber)
sb.append(number)
}
return sb.toString()
}
সুপার ডুপার হতে))
fun rnd_int(min: Int, max: Int): Int {
var max = max
max -= min
return (Math.random() * ++max).toInt() + min
}
java.util.Random
?