আমি কীভাবে কোটলিনে এলোমেলো নম্বর পেতে পারি?


151

একটি জেনেরিক পদ্ধতি যা রুবীর মতো 2 পরামিতিগুলির মধ্যে একটি এলোমেলোভাবে পূর্ণসংখ্যা ফেরত দিতে পারে rand(0..n)

যেকোনো পরামর্শ?

উত্তর:


373

আমার পরামর্শটি এ জাতীয় এলোমেলো তৈরির জন্য ইন্ট্রাঞ্জের একটি এক্সটেনশন ফাংশন হবে :(0..10).random()

টিএল; ডিআর কোটলিন> = 1.3, সমস্ত প্ল্যাটফর্মের জন্য একটি র্যান্ডম

1.3 হিসাবে, কোটলিন তার নিজস্ব মাল্টি-প্ল্যাটফর্ম র্যান্ডম জেনারেটর নিয়ে আসে। এটি এই কেইপিতে বর্ণিত হয়েছে । নীচের বর্ণিত এক্সটেনশনটি এখন কোটলিন স্ট্যান্ডার্ড লাইব্রেরির অংশ , কেবল এটি এর মতো ব্যবহার করুন:

val rnds = (0..10).random()

কোটলিন <1.3

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এসগুলির জন্য একটি এক্সটেনশন ফাংশনও অন্তর্ভুক্ত করে ।


আমি ধরে নিলাম এটিও জাভা ব্যবহার করে java.util.Random?
সাইমন ফোরসবার্গ

পছন্দ করুন : আমি যা ব্যবহার দেখা যায় না অন্য উত্তর যোগ stackoverflow.com/a/49507413/8073652
s1m0nw1

ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত সিউডো-র্যান্ডম নম্বর জেনারেটর (সিএসপিআরএনজি) যুক্ত করার জন্য এখানে একটি প্রস্তাবও রয়েছে: github.com/Kotlin/KEEP/issues/184
জোনাথন লেটসচুহ

41

from(সমেত) এবং to(একচেটিয়া) এর মধ্যে একটি এলোমেলো পূর্ণসংখ্যা তৈরি করুন

import java.util.Random

val random = Random()

fun rand(from: Int, to: Int) : Int {
    return random.nextInt(to - from) + from
}

1
আপনি যদি কয়েকটি বিস্তৃত র্যান্ডম Intগুলি পেতে চান তবে জাভা -8 এর পরিবর্তে আপনি র্যান্ডম # ইন্টি (আকার, থেকে,) ব্যবহার করতে পারেন ।
হোলি-জাভা

3
এই সমাধানটি জাভাস্ক্রিপ্ট / নেটিভ কোটলিনে কাজ করে না। এটি করার জন্য আরও জেনেরিক পদ্ধতি তৈরি করা ভাল হতে পারে। :)
ভ্যালেন্টিন মিশালাক

@ValentinMichalak আপনি এই এক চেষ্টা করতে পারেন: stackoverflow.com/a/49507413/8073652
s1m0nw1

31

কোটলিন 1.2 হিসাবে, আপনি লিখতে পারেন:

(1..3).shuffled().last()

এটি সচেতন হোন এটি বড় ও (এন), তবে একটি ছোট তালিকার জন্য (বিশেষত অনন্য মানের) এটি ঠিক আছে: ডি


এই একটি কোটলিন-নেটিভের জন্য দরকারী
ব্যবহারকারী 3471194

11

আপনি এর অনুরূপ একটি এক্সটেনশান ফাংশন তৈরি করতে পারেন 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

10

এলোমেলো অক্ষরের জন্য আমার অন্যান্য উত্তরের সম্ভাব্য পার্থক্য

এলোমেলোভাবে পেতে 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 এলোমেলো জন্য মাল্টিপ্লাটফর্ম সমর্থন

1.3 হিসাবে, কোটলিন তার নিজস্ব মাল্টিপ্লাটফর্ম র‌্যান্ডম জেনারেটর নিয়ে আসে। এটি এই কেইপিতে বর্ণিত হয়েছে । আপনি এখন এক্সটেনশনটি কোটলিন স্ট্যান্ডার্ড লাইব্রেরির কোনও অংশ হিসাবে না দিয়ে সরাসরি ব্যবহার করতে পারেন:

('a'..'b').random()

7

@ S1m0nw1 চমত্কার উত্তর বন্ধ করে আমি নিম্নলিখিত পরিবর্তনগুলি করেছি।

  1. (0..n) কোটলিনে অন্তর্ভুক্ত বোঝায়
  2. (0 অবধি এন) কোটলিনে একচেটিয়াভাবে বোঝায়
  3. এলোমেলো উদাহরণের জন্য একটি সিঙ্গলটন অবজেক্ট ব্যবহার করুন (alচ্ছিক)

কোড:

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())
                }
        )
    }

5

পরিসীমা এলোমেলো উদাহরণ [1, 10]

val random1 = (0..10).shuffled().last()

বা জাভা র্যান্ডম ব্যবহার

val random2 = Random().nextInt(10) + 1

1
আপনার প্রথম উত্তরটি আমি সবচেয়ে পছন্দ করি। এটি একটি নিখুঁত এক-লাইনার যা কোনও প্রকারের এক্সটেনশন ফাংশনগুলি লেখার বিষয়ে নির্ভর করে না
অ্যালেক্স সেমেনিয়ুক

4

কোটলিন> = 1.3, এলোমেলো জন্য মাল্টিপ্লাটফর্ম সমর্থন

1.3 হিসাবে, স্ট্যান্ডার্ড লাইব্রেরিটি এলোমেলো জন্য বহু-প্ল্যাটফর্ম সমর্থন সরবরাহ করেছে, এই উত্তরটি দেখুন।

কোটলিন <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()

4

S1m0nw1 এর উত্তর কার্যকর করার আরেকটি উপায় হ'ল এটি একটি ভেরিয়েবলের মাধ্যমে অ্যাক্সেস করা। এটি আরও কার্যকর নয় তবে এটি () টাইপ করা থেকে বাঁচায়।

val ClosedRange<Int>.random: Int
    get() = Random().nextInt((endInclusive + 1) - start) +  start 

এবং এখন এটি যেমন অ্যাক্সেস করা যেতে পারে

(1..10).random


2

এমন কোনও মানক পদ্ধতি নেই যা এটি করে তবে আপনি সহজেই নিজের তৈরি করতে পারেন হয় হয় Math.random()বা ক্লাসটি ব্যবহার করে java.util.RandomMath.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]

2

কোটলিন স্ট্যান্ডার্ড লাইব র‌্যান্ডম নম্বর জেনারেটর এপিআই সরবরাহ করে না। আপনি যদি কোনও মাল্টিপ্লাটফর্ম প্রকল্পে না থাকেন তবে প্ল্যাটফর্ম এপিআই ব্যবহার করা ভাল (এই সমাধান সম্পর্কে প্রশ্নের বাক্সের সমস্ত উত্তর)

তবে আপনি যদি একাধিক প্ল্যাটফর্মের প্রসঙ্গে থাকেন তবে প্ল্যাটফর্মগুলির মধ্যে একই র্যান্ডম সংখ্যার জেনারেটর ভাগ করে নেওয়ার জন্য খাঁটি কোটলিনে নিজের দ্বারা এলোমেলোভাবে প্রয়োগ করা ভাল সমাধান। এটি দেব এবং পরীক্ষার জন্য আরও সহজ।

আমার ব্যক্তিগত প্রকল্পে এই সমস্যার উত্তর দেওয়ার জন্য, আমি একটি খাঁটি কোটলিন লিনিয়ার ক্রেগ্রুভেনিয়াল জেনারেটর প্রয়োগ করি । এলসিজি হ'ল ব্যবহৃত অ্যালগরিদম java.util.Random। আপনি যদি এটি ব্যবহার করতে চান তবে এই লিঙ্কটি অনুসরণ করুন: https://gist.github.com/11e5ddb567786af0ed1ae4d7f57441d4

আপনার জন্য আমার বাস্তবায়ন উদ্দেশ্য nextInt(range: IntRange);)।

আমার উদ্দেশ্য সম্পর্কে যত্ন নিন, এলসিজি বেশিরভাগ ব্যবহারের ক্ষেত্রে (সিমুলেশন, গেমস ইত্যাদি) জন্য ভাল তবে এই পদ্ধতির পূর্বাভাসের কারণে ক্রিপ্টোগ্রাফিকভাবে ব্যবহারের জন্য উপযুক্ত নয়।


আমি বরং নিজস্ব র্যান্ডম অ্যালগরিদম তৈরি করার চেয়ে প্ল্যাটফর্মের নির্দিষ্ট কোডের উপর নির্ভর করব। এটি java.util.Random এর কোড সম্পর্কে কিছুটা মনে করিয়ে দেয় তবে এটি সম্পূর্ণরূপে মেলে না।
সাইমন ফোরসবার্গ

2

আপনি যে নম্বরগুলি থেকে নির্বাচন করতে চান তা যদি ধারাবাহিক না হয় তবে আপনি ব্যবহার করতে পারেন random()

ব্যবহার:

val list = listOf(3, 1, 4, 5)
val number = list.random()

তালিকায় থাকা একটি নম্বর প্রদান করে।


2

আর কাস্টম এক্সটেনশন ফাংশন ব্যবহার করার প্রয়োজন নেই। IntRange টি random()এক্সটেনশন ফাংশন আউট-অফ-বক্স এখন।

val randomNumber = (0..10).random()

2

একটি শীর্ষ-স্তরের ফাংশন ব্যবহার করে, আপনি রুবির মতো (যেমন আপনি চান) ঠিক একই কল সিনট্যাক্স অর্জন করতে পারেন:

fun rand(s: Int, e: Int) = Random.nextInt(s, e + 1)

ব্যবহার:

rand(1, 3) // returns either 1, 2 or 3

1

প্রথমত, আপনার একটি আরএনজি দরকার। কোটলিনে আপনাকে বর্তমানে প্ল্যাটফর্মটি নির্দিষ্ট ব্যবহার করতে হবে (একটিতে কোনও কোটলিন অন্তর্নির্মিত নেই)। জেভিএম এর জন্য এটি java.util.Random। আপনার এটির একটি উদাহরণ তৈরি করতে হবে এবং তারপরে কল করতে হবে random.nextInt(n)


1

কোটলিনে একটি এলোমেলো নম্বর পেতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন :

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

আশাকরি এটা সাহায্য করবে.


0

আপনি একটি এক্সটেনশন ফাংশন তৈরি করতে পারেন:

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


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("")
        }
    }
}

0

যখনই এমন কোনও পরিস্থিতি তৈরি হয় যখন আপনি কী বা ম্যাক ঠিকানা তৈরি করতে চান যা ব্যবহারকারীর চাহিদার ভিত্তিতে ডিজিটযুক্ত হেক্সাডেসিমাল সংখ্যা এবং এটিও অ্যান্ড্রয়েড এবং কোটলিন ব্যবহার করে থাকে, তারপরে আপনি আমার নীচের কোডটি আপনাকে সহায়তা করে:

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()
} 

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.