সুইফটের সাথে এলোমেলো সংখ্যা তৈরি করা হচ্ছে


92

আমার একটি এলোমেলো সংখ্যা তৈরি করা দরকার।

এটি arc4randomফাংশনের পাশাপাশি arc4random_uniformফাংশনটির অস্তিত্ব নেই বলে মনে হয় ।

অপশন আমি আছে arc4random_stir(), arc4random_buf(UnsafeMutablePointer<Void>, Int)এবং arc4random_addrandom(UnsafeMutablePointer<UInt8>, Int32)

আমি ফাংশনগুলিতে কোনও দস্তাবেজ খুঁজে পাচ্ছি না এবং শিরোনাম ফাইলগুলিতে কোনও মন্তব্য ইঙ্গিত দেয় না।


4
এটি প্রদর্শিত হবে যে এক্সকোডে অটো-সম্পূর্ণ সবেমাত্র ব্রেক হয়েছে। আমি শপথ করতে পারি যে আমি এটি স্বয়ংক্রিয়-সম্পূর্ণ ছাড়াই টাইপ করেছি এবং এটি সংকলন করে নি। কাজ করছি. @Arsen দ্বারা দুর্দান্ত রেফারেন্স
বড়_ম্যাক

4
arc4random_uniform উপলব্ধ। এটি ভাষার মূল অংশ নয়, ফাউন্ডেশন এপিআইয়ের একটি অংশ, সুতরাং ফাইলটি উপলভ্য করার জন্য আপনার মাথাতে একটি "আমদানি ফাউন্ডেশন" (বা "আমদানি ইউআইকিট") প্রয়োজন।
ভিন্স ও'সুলিভান

সম্ভাব্যতা = আন্ত (arc4random_uniform (UInt32 (মোট))) - কারণ টাইপহেডটি নষ্ট হয়ে গেছে, টাইপিংয়ের অভিযোগগুলি অ-নির্দিষ্ট ছিল, এটি ছিল আমার
অভিনয়ের অভিযোগটি

উত্তর:


227

===== সুইফট 4.2 / এক্সকোড 10 =====

let randomIntFrom0To10 = Int.random(in: 1..<10)
let randomFloat = Float.random(in: 0..<1)

// if you want to get a random element in an array
let greetings = ["hey", "hi", "hello", "hola"]
greetings.randomElement()

হুডের অধীনে সুইফট arc4random_bufকাজ শেষ করতে ব্যবহার করে।

===== সুইফট 4.1 / এক্সকোড 9 =====

arc4random()0 থেকে 4 294 967 295 এর পরিসরে একটি এলোমেলো সংখ্যা প্রদান করে

drand48()0.0 থেকে 1.0 এর পরিসরে একটি এলোমেলো সংখ্যা প্রদান করে

arc4random_uniform(N)0 থেকে N - 1 এর মধ্যে একটি এলোমেলো সংখ্যা প্রদান করে

উদাহরণ:

arc4random() // => UInt32 = 2739058784
arc4random() // => UInt32 = 2672503239
arc4random() // => UInt32 = 3990537167
arc4random() // => UInt32 = 2516511476
arc4random() // => UInt32 = 3959558840

drand48() // => Double = 0.88642843322303122
drand48() // => Double = 0.015582849408328769
drand48() // => Double = 0.58409022031727176
drand48() // => Double = 0.15936862653180484
drand48() // => Double = 0.38371587480719427

arc4random_uniform(3) // => UInt32 = 0
arc4random_uniform(3) // => UInt32 = 1
arc4random_uniform(3) // => UInt32 = 0
arc4random_uniform(3) // => UInt32 = 1
arc4random_uniform(3) // => UInt32 = 2

arc4random_uniform () এর মতো নির্মাণের উপরে সুপারিশ করা হয় arc4random() % upper_boundকারণ উপরের চৌম্বকটি দুটির শক্তি না হলে "মডুলো পক্ষপাত" এড়ানো হয়।


Float.random()বর্তমানে বিটা হিসাবে চিহ্নিত হয়েছে এবং তাই দেয়'Float' has no member 'random'
ডেল

22

আপনি পাশাপাশি চেষ্টা করতে পারেন:

let diceRoll = Int(arc4random_uniform(UInt32(6)))

এটি কাজ করতে আমাকে "UInt32" যুক্ত করতে হয়েছিল।


4
আমি এই ফাংশনটি যখন দেখি তখন দেখি public func arc4random_uniform(_: UInt32) -> UInt32। তাই আমি ভাবছি কেন প্যারামিটারে রূপান্তর করব UInt32? এখানে কি আর কিছু হচ্ছে?
মার্ক Moeykens

8

কেবল এই ফাংশনটিতে কল করুন এবং ন্যূনতম এবং সর্বাধিক পরিসীমা সরবরাহ করুন এবং আপনি একটি এলোমেলো নম্বর পাবেন।

উদাঃ র্যান্ডম নাম্বারের মতো (MIN: 0, MAX: 10) এবং আপনি 0 থেকে 9 এর মধ্যে নম্বর পাবেন ।

func randomNumber(MIN: Int, MAX: Int)-> Int{
    return Int(arc4random_uniform(UInt32(MAX-MIN)) + UInt32(MIN));
}

দ্রষ্টব্য: - আপনি সর্বদা একটি পূর্ণসংখ্যার ফলাফল পাবেন।


4
আমি মনে করি এটি হওয়া দরকার: func randomNumber(MIN: Int, MAX: Int)-> Int{ return Int(arc4random_uniform(UInt32(MAX-MIN)) + UInt32(MIN)); }
অ্যাডাহুস

5

কিছু তদন্তের পরে আমি এটি লিখেছি:

import Foundation

struct Math {
   private static var seeded = false

   static func randomFractional() -> CGFloat {

      if !Math.seeded {
         let time = Int(NSDate().timeIntervalSinceReferenceDate)
         srand48(time)
         Math.seeded = true
      }

      return CGFloat(drand48())
   }
}

এখন আপনি কেবল Math.randomFraction()র্যান্ডম সংখ্যা [0..1 [প্রথমে বপনের কথা মনে না রেখেই পেতে পারেন)। আশা করি এটি কাউকে সহায়তা করবে: ও)


4

দ্রুত 4.2 সহ আপডেট করুন:

let randomInt = Int.random(in: 1..<5)
let randomFloat = Float.random(in: 1..<10)
let randomDouble = Double.random(in: 1...100)
let randomCGFloat = CGFloat.random(in: 1...1000)

3

অন্য বিকল্পটি হল xorshift128 প্লাস অ্যালগরিদম ব্যবহার করা:

func xorshift128plus(seed0 : UInt64, _ seed1 : UInt64) -> () -> UInt64 {
    var state0 : UInt64 = seed0
    var state1 : UInt64 = seed1
    if state0 == 0 && state1 == 0 {
        state0 = 1 // both state variables cannot be 0
    }

    func rand() -> UInt64 {
        var s1 : UInt64 = state0
        let s0 : UInt64 = state1
        state0 = s0
        s1 ^= s1 << 23
        s1 ^= s1 >> 17
        s1 ^= s0
        s1 ^= s0 >> 26
        state1 = s1
        return UInt64.addWithOverflow(state0, state1).0
    }

    return rand
}

এই অ্যালগরিদমের সময়কাল 2 ^ 128 - 1 এবং বিগক্রাশ টেস্ট স্যুটটির সমস্ত পরীক্ষায় পাস করে । মনে রাখবেন যে এটি দীর্ঘ সময় সহ উচ্চ-মানের সিউডো-এলোমেলো সংখ্যা জেনারেটর, এটি কোনও ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত র্যান্ডম সংখ্যা জেনারেটর নয়

আপনি এটি বর্তমান সময় বা এন্ট্রপির কোনও এলোমেলো উত্স থেকে বীজ করতে পারেন। উদাহরণস্বরূপ, যদি আপনার কাছে এমন কোনও ফাংশন থাকে urand64()যা UInt64থেকে পড়তে /dev/urandomপারে তবে আপনি এটি ব্যবহার করতে পারেন:

let rand = xorshift128plus(urand64(), urand64())
for _ in 1...10 {
    print(rand())
}


1

সুইফ্ট 3 এ:

এটি সীমাবদ্ধতার মধ্যে 0 এর মধ্যে এলোমেলো সংখ্যা তৈরি করবে

let limit : UInt32 = 6
print("Random Number : \(arc4random_uniform(limit))")

এবং যদি আমি একটি র্যান্ডম সংখ্যা 5 থেকে 10 0 থেকে এন নম্বরে জেনারেট করতে না চান
ঋষি

4
@ Iষি 5 থেকে 10 পর্যন্ত হবেarc4random_uniform(6) + 5
ম্যাট লে ফ্লুর

1

আমার এক্সটেনশন হিসাবে আমার বাস্তবায়ন। পরিসীমা এলোমেলো সংখ্যা উত্পন্ন করবেfrom..<to

public extension Int {
    static func random(from: Int, to: Int) -> Int {
        guard to > from else {
            assertionFailure("Can not generate negative random numbers")
            return 0
        }
        return Int(arc4random_uniform(UInt32(to - from)) + UInt32(from))
    }
}

1

এইভাবে আমি 2 ইন্টের মধ্যে একটি এলোমেলো নম্বর পাই!

func randomNumber(MIN: Int, MAX: Int)-> Int{
    var list : [Int] = []
    for i in MIN...MAX {
        list.append(i)
    }
    return list[Int(arc4random_uniform(UInt32(list.count)))]
}

ব্যবহার:

print("My Random Number is: \(randomNumber(MIN:-10,MAX:10))")

1

আর একটি অপশন হ'ল গেমকিট থেকে জিকেমারসনেটুইস্টারর্যান্ডমসোর্স ব্যবহার করা । দস্তাবেজগুলি বলেছেন:

একটি নির্জনবাদী সিউডো-এলোমেলো উত্স যা মেরসেন টুইস্টার অ্যালগরিদমের উপর ভিত্তি করে এলোমেলো সংখ্যা উত্পন্ন করে। এটি নির্ভরযোগ্য গেমপ্লে মেকানিক্স তৈরির জন্য উপযুক্ত একটি ডিস্ট্রিমেন্টিক এলোমেলো উত্স। এটি একটি আরক 4 উত্সের তুলনায় কিছুটা ধীর গতিযুক্ত, তবে আরও এলোমেলোভাবে এর ক্রমগুলি পুনরাবৃত্তি করা পর্যন্ত এটির দীর্ঘ সময় রয়েছে। নির্বোধের সময়, এটি কোনও ক্রিপ্টোগ্রাফিক র্যান্ডম উত্স নয়। এটি গেমপ্লে ডেটা অবলম্বনের জন্য উপযুক্ত।

import GameKit

let minValue = 0
let maxValue = 100

var randomDistribution: GKRandomDistribution?
let randomSource = GKMersenneTwisterRandomSource()
randomDistribution = GKRandomDistribution(randomSource: randomSource, lowestValue: minValue, highestValue: maxValue)
let number = randomDistribution?.nextInt() ?? 0
print(number)

অ্যাপলের নমুনা কোড থেকে নেওয়া উদাহরণ: https://github.com/carekit-apple/CareKit/blob/master/CareKitPrototypingTool/OCKPrototyper/CareKitPatient/RandomNumberGeneratorHelper.swift


1

আমি পার্টিতে দেরি করছি 🤩🎉

এমন একটি ফাংশন ব্যবহার করা যা আপনাকে অ্যারের আকার পরিবর্তন করতে দেয় এবং ফ্লাইয়ের মধ্যে পরিসর নির্বাচন সর্বাধিক বহুমুখী পদ্ধতি। আপনি মানচিত্রটিও ব্যবহার করতে পারেন তাই এটি খুব সংক্ষিপ্ত। আমি এটি আমার সমস্ত পারফরম্যান্স টেস্টিং / বেঞ্চ চিহ্নিতকরণে ব্যবহার করি।

elementsঅ্যারে আইটেমের সংখ্যা
কেবলমাত্র সংখ্যাসমূহ সহ0...max

func randArr(_ elements: Int, _ max: Int) -> [Int] {
        return (0..<elements).map{ _ in Int.random(in: 0...max) }
    }

কোড সেন্স / প্লেসহোল্ডাররা এ জাতীয় চেহারা। randArr(elements: Int, max: Int)

আমার অ্যারেতে 10 থেকে শুরু করে 1000 এর উপাদান রয়েছে।

randArr(10, 1000) // [554, 8, 54, 87, 10, 33, 349, 888, 2, 77]

0

আপনি এটি নির্দিষ্ট হারে ব্যবহার করতে পারেন:

let die = [1, 2, 3, 4, 5, 6]
 let firstRoll = die[Int(arc4random_uniform(UInt32(die.count)))]
 let secondRoll = die[Int(arc4random_uniform(UInt32(die.count)))]

0

এলোমেলো সংখ্যা বা এলোমেলো স্ট্রিংয়ের জন্য সুইফট সহ কোডটি দেয় :)

let quotes: NSArray = ["R", "A", "N", "D", "O", "M"]

      let randomNumber = arc4random_uniform(UInt32(quotes.count))
      let quoteString = quotes[Int(randomNumber)]
      print(quoteString)

এটি এলোমেলোভাবে আপনাকে আউটপুট দেবে।


0

কিছু সংখ্যার পুনরাবৃত্তি হবে তা ভুলে যাবেন না! সুতরাং আপনার মতো কিছু করা দরকার ...

আমার মোট প্রশ্নগুলি 47 ছিল।

func getRandomNumbers(totalQuestions:Int) -> NSMutableArray
{

    var arrayOfRandomQuestions: [Int] = []

    print("arraySizeRequired = 40")
    print("totalQuestions = \(totalQuestions)")

    //This will output a 40 random numbers between 0 and totalQuestions (47)
    while arrayOfRandomQuestions.count < 40
    {

        let limit: UInt32 = UInt32(totalQuestions)

        let theRandomNumber = (Int(arc4random_uniform(limit)))

            if arrayOfRandomQuestions.contains(theRandomNumber)
            {
                print("ping")

            }
            else
            {
            //item not found
                arrayOfRandomQuestions.append(theRandomNumber)
            }

    }

    print("Random Number set = \(arrayOfRandomQuestions)")
    print("arrayOutputCount = \(arrayOfRandomQuestions.count)")


    return arrayOfRandomQuestions as! NSMutableArray

}

-2

দেখুন, আমারও একই সমস্যা ছিল তবে আমি গ্লোবাল ভেরিয়েবল হিসাবে ফাংশনটি সন্নিবেশ করি

যেমন

var RNumber = Int(arc4random_uniform(9)+1)

func GetCase(){

your code
}

স্পষ্টত এটি কার্যকর নয়, সুতরাং আমি কেবল কোডটি অনুলিপি করে ফাংশনটিতে আটকান যাতে এটি পুনরায় ব্যবহারযোগ্য হতে পারে, তারপরে এক্সকোড আমাকে পরামর্শ দেয় যাতে আমার কোডটি ছিল তাই ধ্রুবক হিসাবে ভার সেট করতে হবে

func GetCase() {

let RNumber = Int(arc4random_uniform(9)+1)

   if categoria == 1 {
    }
}

ভাল আমার কোড এর একটি অংশ thats তাই এক্সকোড আমাকে অবিচ্ছেদ্য এবং আরম্ভের কিছু বলুন কিন্তু, এটি যাইহোক অ্যাপ্লিকেশন তৈরি করে এবং সেই পরামর্শটি কেবল অদৃশ্য হয়ে যায়

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

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