アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在Androidアプリを学習しています。

以下コードの解釈がわかりません。

呼び出し
int idx = rand(6);

private static Rondom rand = new Rondom();
public static int rand(int num) {
return (rand.nextInt() >>> 1) % num;
}

特に >>> の記号が意味不明です。
ご教授のほどよろしくお願い致します。

A 回答 (4件)

> 上記コードの場合、乱数をビットシフトして6で割ったあまりと、回りくどいやり方が必要なのでしょう



まず、numで割った余り、というのは、 0<=n<numの整数乱数nを求めるため、というのはよろしいでしょうか。

ビット演算ですが、今回の例では、乱数の質を高めようとしているのだと思われます。

コンピュータが発生する乱数の多くは「疑似乱数」といって、一見バラバラに見えて、実際には計算によって求めたもので、同じ初期条件からは同じ「乱数」が同じ順番で発生します。

JavaのRandomには「線形合同法」という非常に単純で、質のあまりよろしくないものが使われています。
ここでいう質とは、値が偏らない、とか、短いパターンを繰り返さない(奇数のあとには必ず偶数、とかいうことが無い)とかいうものです。

線形合同法では、上位ビットや下位ビットに傾向が出やすいので、真ん中あたりを使って質を上げる、というテクニックがあります。劇的な効果は無いですが、ちょっとだけましになります。

参考URL:http://www001.upp.so-net.ne.jp/isaku/rand.html
    • good
    • 0

gfe01045 です。



>> ビット演算を使用するメリットがいまいち解らないのですが・・・。
処理の速さ以外にはメリットは特にないと思います。
ただ、ビット単位の操作を行なわなければならないプログラムを書くときには必ず使うやりかたです。

画像処理などでデータのビット変換(マスキング)等・・・
+-などの演算子と同じようなものと考えています!!

頑張ってください!!
    • good
    • 0
この回答へのお礼

非常に参考になりました。
まだまだ、勉強不足でした。
ありがとうございました。m(_ _)m

お礼日時:2011/07/05 22:36

つぎのソースをコンパイルして実行してみてください。


おおむね理解しやすいと思います!!

public class bit{
public static void main(String[] args){
int bits=6;//0110

System.out.println(bits&15);//and
System.out.println(bits|15);//or
System.out.println(bits^15);//xor
System.out.println(~bits); //not//符合付き
System.out.println(bits>>2);//rshift
System.out.println(bits<<2);//lshift
}
}
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
ビット演算について、もう少し勉強してみます。

ビット演算を使用するメリットがいまいち解らないのですが・・・。

上記コードの場合、乱数をビットシフトして6で割ったあまりと、回りくどいやり方が必要なのでしょう(+o+)

お礼日時:2011/04/21 12:11
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
上記リンクを参考にビット演算について、もう少し勉強してみます。

上記コードの場合、乱数をビットシフトして6で割ったあまりと、回りくどいやり方が必要なのでしょう(+o+)

ビット演算を使用するメリットは高速に処理できるという事なのでしょうか?
コードを見ても非常に解りづらくなってしまうので、普通に四則演算したいのですが・・・(^_^;)

お礼日時:2011/04/21 12:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!