質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Swift

    7227questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Swift 2

    1331questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

乱数の中から値を重複することなく取り出したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 901

afuroda

score 25

前提・実現したいこと

乱数の中から値を重複することなく取り出したいんです。
ネットで調べながら自分なりに下記のコードを書いてみたのですが値が重複してしまい困っています。どなたか助けてください。

該当のソースコード

var a : NSMutableArray = [0,1,2,3,4]
var b = NSMutableArray()
var z = 5


for var i = 0; i < 5; i++ {
    var c = arc4random()%UInt32(z)
    b.addObject(a[Int(c)])
    a.removeObject(Int(c))
    z -= 1


}

補足情報(言語/FW/ツール等のバージョンなど)

swift2を使っています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

二重発行しないと言うことで乱数では無いようですね。

発行済の乱数をテーブルに保存して、発行時に重複発行か確認します。もし重複していたら再度発行します。

もしくは、トランプをシャッフルした時に上からめくっていくと一見ランダムに見えると思いますが、それと同じことを行います。あらかじめ発行したい数値をランダムに並べ替え、その配列を上から使っていくなどが良いです。

ランダムに並べる方法は、例えばトランプに乱数を割り当てます。その後乱数の小さい順にトランプを並べ替えます。この時使う乱数は発行したいトランプの数よりも大幅に大きい範囲を使うと良いです。並べ替えたトランプを順番に発行すると一見ランダムに見えるはずです。

追記:
swift2ではなくて申し訳ありませんが、JavaScriptで後半の内容を実装してみました。
0から19の乱数を発生させたところ以下の順で発生させることができました。
5,7,17,12,8,9,1,3,10,6,14,16,18,15,0,11,2,4,13,19

  var ary = [];

 // まずは乱数と配列添え字を配列に順番に入れていく
  for( var i=0;i<20;i++)
  {
    var rand = Math.floor( Math.random() * 10000 ) ;
    ary[i] = {'rand':rand,'value':i};
  }

  // 配列を乱数でソートする
  ary.sort(function(a,b){
    return ( a.rand < b.rand ? 1 : -1);
  });

  // 配列の先頭から添え字を取り出すことで重複しない数字を取得する。
  var resutl="";
  for( var i=0;i<20;i++)
  {
    resutl += ary[i].value +',';
  }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

a.removeObject(Int(c))

が間違ってます。

a.removeObject(a[Int(c)])
//もしくは
a.removeObjectAtIndex(Int(c))

 おまけ

 乱数

乱数生成はarc4random_uniform()を使うほうが良いです。

 変数c

cは代入するときにキャストしておくと、後のコードがスッキリします。

var c = Int(arc4random...)

 変数z

zを持つ必要はありません。5 - iで求められます。

 for

今の書き方はSwift3で使えなくなっています。早めに新しい書き方に慣れておいた方がいいです。(Warningが出ていると思いますが)

for i in 0 ..< 5 {

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    StringをIntに変換

    var a="841003856650283" var b=a(1).toInt println(b) println(a(1).toInt) としたさい 56 56 が

  • 解決済

    決められた数の空の配列に文字列を一文字ずつ格納する方法

    swiftのコーディングに関する質問です。 空の配列が下記のように5つ用意されている場合において、文字列の数に応じて順番に一文字ずつ格納したいのですが、どのようにすればよいのでし

  • 解決済

    配列の繰り返し処理について

    前提・実現したいこと a[100]の配列のa[3]までは初期化されていて、初期化されていない残りの要素に配列の最初の4要素の並びを繰り返しコピーして格納するプログラミングを教えて

  • 解決済

    unityで隠しコマンド的なものを導入したいです。

    前提・実現したいこと unityで簡単なゲームをつくっています。 その中で、指定したコマンドを入力したら、シーン切り替えをするという動作をさせたいのですが、コードの書き方がわか

  • 解決済

    配列

    int[]total={10,20,30,40,50};  の要素の合計の求め方を教えてもらえませんか。 宜しくお願いします。

  • 受付中

    一ヶ月を分割する様な計算

    1月を複数分割する様な計算をしたいのですが簡潔に記載できる様な気がするのですがいかんせん思いつかずこまっています 特にif文のto_dateを分割した日として処理で使う必要があるの

  • 受付中

    コマンドライン引数から名前と点数を入力して偏差値を計算

    前提・実現したいこと コマンドライン引数から複数人の名前と点数を入力して偏差値を計算し、 名前  名前  名前 点数  点数  点数 偏差値 偏差値 偏差値 の順に表示させたい

  • 解決済

    各二次元配列の0番目を対象とした要素の削除と昇順

    前提・実現したいこと 各二次元配列の0番目を対象とした要素の削除と昇順を実装したいと考えています。 実現したいことの詳細は、以下のソースコードのコメントに記述しました。 この問

同じタグがついた質問を見る

  • Swift

    7227questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Swift 2

    1331questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。