同步操作将从 编程语言算法集/Java 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package Others;import java.util.ArrayList;import java.util.Random;import java.util.concurrent.ThreadLocalRandom;/** @author dimgrichr */public class CRCAlgorithm {private int correctMess;private int wrongMess;private int wrongMessCaught;private int wrongMessNotCaught;private int messSize;private double ber;private boolean messageChanged;private ArrayList<Integer> message;private ArrayList<Integer> dividedMessage;private ArrayList<Integer> p;private Random randomGenerator;/*** The algorithm's main constructor. The most significant variables, used in the algorithm, are* set in their initial values.** @param str The binary number P, in a string form, which is used by the CRC algorithm* @param size The size of every transmitted message* @param ber The Bit Error Rate*/public CRCAlgorithm(String str, int size, double ber) {messageChanged = false;message = new ArrayList<>();messSize = size;dividedMessage = new ArrayList<>();p = new ArrayList<>();for (int i = 0; i < str.length(); i++) {p.add(Character.getNumericValue(str.charAt(i)));}randomGenerator = new Random();correctMess = 0;wrongMess = 0;wrongMessCaught = 0;wrongMessNotCaught = 0;this.ber = ber;}/*** Returns the counter wrongMess** @return wrongMess, the number of Wrong Messages*/public int getWrongMess() {return wrongMess;}/*** Returns the counter wrongMessCaught** @return wrongMessCaught, the number of wrong messages, which are caught by the CRC algoriithm*/public int getWrongMessCaught() {return wrongMessCaught;}/*** Returns the counter wrongMessNotCaught** @return wrongMessNotCaught, the number of wrong messages, which are not caught by the CRC* algorithm*/public int getWrongMessNotCaught() {return wrongMessNotCaught;}/*** Returns the counter correctMess** @return correctMess, the number of the Correct Messages*/public int getCorrectMess() {return correctMess;}/*** Resets some of the object's values, used on the main function, so that it can be re-used, in* order not to waste too much memory and time, by creating new objects.*/public void refactor() {messageChanged = false;message = new ArrayList<>();dividedMessage = new ArrayList<>();}/*** Random messages, consisted of 0's and 1's, are generated, so that they can later be transmitted*/public void generateRandomMess() {for (int i = 0; i < messSize; i++) {int x = ThreadLocalRandom.current().nextInt(0, 2);message.add(x);}}/*** The most significant part of the CRC algorithm. The message is divided by P, so the* dividedMessage ArrayList<Integer> is created. If check == true, the dividedMessaage is* examined, in order to see if it contains any 1's. If it does, the message is considered to be* wrong by the receiver,so the variable wrongMessCaught changes. If it does not, it is accepted,* so one of the variables correctMess, wrongMessNotCaught, changes. If check == false, the* diviided Message is added at the end of the ArrayList<integer> message.** @param check the variable used to determine, if the message is going to be checked from the* receiver if true, it is checked otherwise, it is not*/public void divideMessageWithP(boolean check) {ArrayList<Integer> x = new ArrayList<>();ArrayList<Integer> k = (ArrayList<Integer>) message.clone();if (!check) {for (int i = 0; i < p.size() - 1; i++) {k.add(0);}}while (!k.isEmpty()) {while (x.size() < p.size() && !k.isEmpty()) {x.add(k.get(0));k.remove(0);}if (x.size() == p.size()) {for (int i = 0; i < p.size(); i++) {if (x.get(i) == p.get(i)) {x.set(i, 0);} else {x.set(i, 1);}}for (int i = 0; i < x.size() && x.get(i) != 1; i++) {x.remove(0);}}}dividedMessage = (ArrayList<Integer>) x.clone();if (!check) {for (int z : dividedMessage) {message.add(z);}} else {if (dividedMessage.contains(1) && messageChanged) {wrongMessCaught++;} else if (!dividedMessage.contains(1) && messageChanged) {wrongMessNotCaught++;} else if (!messageChanged) {correctMess++;}}}/*** Once the message is transmitted, some of it's elements, is possible to change from 1 to 0, or* from 0 to 1, because of the Bit Error Rate (ber). For every element of the message, a random* double number is created. If that number is smaller than ber, then the spesific element* changes. On the other hand, if it's bigger than ber, it does not. Based on these changes. the* boolean variable messageChanged, gets the value: true, or false.*/public void changeMess() {for (int y : message) {double x = randomGenerator.nextDouble();while (x < 0.0000 || x > 1.00000) {x = randomGenerator.nextDouble();}if (x < ber) {messageChanged = true;if (y == 1) {message.set(message.indexOf(y), 0);} else {message.set(message.indexOf(y), 1);}}}if (messageChanged) {wrongMess++;}}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。