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

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

ただいまの
回答率

90.34%

  • Swift

    7644questions

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

  • Swift 2

    1334questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,024

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.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • Swift

    7644questions

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

  • Swift 2

    1334questions

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