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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

6回答

899閲覧

String型で2進数表示した値の0を1にランダムに変更する方法について

bigbanjaiko

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2018/11/15 08:05

編集2018/11/15 08:11

(例)
String val = "01001001";

"01111001";

上記のようにString型の2進数で表示された値の0の部分について
ランダムに1に変更した値を求めるにはどうすればよいでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ちゃんとしたランダムじゃないですが‥。

java

1Random rand = new Random(); 2int dec = rand.nextInt(256) | Integer.parseInt(val, 2);

とりあえず8bit決め打ちです。

投稿2018/11/15 08:42

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bigbanjaiko

2018/11/15 15:27

ありがとうございます!
guest

0

単純な方法であれば以下の手順ですかね。

  1. 変換後の文字列を格納する変数を用意する(tmp)
  2. 文字列を一文字ずつみる

2-1. 0ならランダムに0or1を生成し、tmpに追加
2-2. 1ならそのままtmpに追加
3. tmpを表示

投稿2018/11/15 08:20

dice142

総合スコア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
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もともとの文字列のうち、1である桁はそのまま1に、0の桁は1又は0にという変換ならビット演算で良いのではないでしょうか。

具体的には、元の文字列と同じ桁数を持つビット列をランダムに生成し、ORを取れば実現できます。

例)
元のビット配列(A):01001001
生成した配列(B) :10101010(ランダムに生成)
AとBのOR(A|B)  :11101011

Stringとビット配列の変換は必要ですが参考になればと思います。

投稿2018/11/15 12:54

Simb

総合スコア118

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問