(例)
String val = "01001001";
↓
"01111001";
上記のようにString型の2進数で表示された値の0の部分について
ランダムに1に変更した値を求めるにはどうすればよいでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答6件
0
ちゃんとしたランダムじゃないですが‥。
java
1Random rand = new Random(); 2int dec = rand.nextInt(256) | Integer.parseInt(val, 2);
とりあえず8bit決め打ちです。
投稿2018/11/15 08:42
総合スコア16733
0
java の文字列操作の練習ですね。
- Javaの文字列(String)クラスについて
https://morizyun.github.io/java/type-string.html
charAt と setCharAt で書いてみます。(他の方法はいくらでもあります)
java
1import java.util.Random; 2 3public class Tera { 4 public static void main(String[] args) { 5 String val = "01001001"; 6 StringBuilder sb = new StringBuilder(val); 7 Random rnd = new Random(); 8 9 int len = val.length(); 10 for (int i = 0; i < len; i++) { 11 char c = val.charAt(i); 12 if (c == '0') { 13 if (rnd.nextInt(2) == 1) { 14 sb.setCharAt(i, '1'); 15 } 16 } 17 } 18 System.out.println(sb); 19 } 20}
投稿2018/11/15 21:53
総合スコア22328
0
ベストアンサー
お好きなコースをどうぞ。
なお共通で変数String val = "01001001";を扱うことにします。
単純に文字列置き換え
java
1StringBuilder builder = new StringBuilder(val); 2for (int i = 0; i < builder.length(); i++) { 3 // ここは使う確率に応じて変更 4 if (Math.random() * 2 < 1) { 5 builder.setCharAt(i, '1'); 6 } 7} 8System.out.println(builder.toString());
乱数との論理和を取る(intバージョン)
java
1int target = Integer.parseInt(val, 2); 2int rnd = (int)(Math.random() * (1 << val.length())); 3int result = target | rnd; 4System.out.println(Integer.toString(result, 2));
乱数との論理和を取る(BigIntegerバージョン)
java
1BigInteger target = new BigInteger(val, 2); 2String rndStr = Stream.generate(() -> Math.random() < 0.5 ? "0" : "1") 3 .limit(val.length()) 4 .collect(Collectors.joining()); 5BigInteger rnd = new BigInteger(rndStr, 2); 6BigInteger result = target.or(rnd); 7System.out.println(result.toString(2));
ただし論理和バージョンは先頭の0が出ないので注意。別途の工夫が必要になる。
投稿2018/11/15 15:15
総合スコア20675
0
単純な方法であれば以下の手順ですかね。
- 変換後の文字列を格納する変数を用意する(tmp)
- 文字列を一文字ずつみる
2-1. 0ならランダムに0or1を生成し、tmpに追加
2-2. 1ならそのままtmpに追加 - tmpを表示
投稿2018/11/15 08:20
総合スコア5158
0
ぱっと思いついた方法。
Java
1final Random rand = new Random(); 2String dst = Arrays.stream(val.split("")) 3 .map( 4 ch -> rand.nextInt(100) < 50 ? "1" : ch 5 ) 6 .collect(Collectors.joining()) 7;
投稿2018/11/15 08:18
編集2018/11/15 12:59総合スコア35680
0
もともとの文字列のうち、1である桁はそのまま1に、0の桁は1又は0にという変換ならビット演算で良いのではないでしょうか。
具体的には、元の文字列と同じ桁数を持つビット列をランダムに生成し、ORを取れば実現できます。
例)
元のビット配列(A):01001001
生成した配列(B) :10101010(ランダムに生成)
AとBのOR(A|B) :11101011
Stringとビット配列の変換は必要ですが参考になればと思います。
投稿2018/11/15 12:54
総合スコア118
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。