How to add pattern to random? [closed] - c#

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 3 years ago.
Improve this question
How to add like number or character pattern to my random keygen?
and is it hard becuse im new to coding :) Thx for Help!
it took me alot of time to get to this and been stuck here for 1 and half day and can't find way to add patterns to this
Like This :
D4B6C5604E26-4F1198-44C1
EA3705694B8A-478E83-2D01
D3B8E2DE7BFC-49CF95-68E6
A6CD996B352A-48B89A-8C69
After - 4 Numbers and After second - 3 Numbers
static void Main(string[] args)
{
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var stringChars = new char[12];
var stringChars4 = new char[6];
var stringChars7 = new char[4];
var random = new Random();
for (int i = 0; i < stringChars.Length; i++)
{
stringChars[i] = chars[random.Next(chars.Length)];
}
for (int i = 0; i < stringChars4.Length; i++)
{
stringChars4[i] = chars[random.Next(chars.Length)];
}
for (int i = 0; i < stringChars7.Length; i++)
{
stringChars7[i] = chars[random.Next(chars.Length)];
}
var finalString = new String(stringChars);
var finalString4 = new String(stringChars4);
var finalString7 = new String(stringChars7);
var chars2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var stringChars2 = new char[12];
var stringChars5 = new char[6];
var stringChars8 = new char[4];
var randoms = new Random();
for (int i = 0; i < stringChars.Length; i++)
{
stringChars2[i] = chars2[random.Next(chars.Length)];
}
for (int i = 0; i < stringChars5.Length; i++)
{
stringChars5[i] = chars2[random.Next(chars.Length)];
}
for (int i = 0; i < stringChars8.Length; i++)
{
stringChars8[i] = chars2[random.Next(chars.Length)];
}
var finalString2 = new String(stringChars2);
var finalString8 = new String(stringChars8);
var finalString5 = new String(stringChars5);
var chars3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var stringChars3 = new char[12];
var stringChars6 = new char[6];
var stringChars9 = new char[4];
var randomss = new Random();
for (int i = 0; i < stringChars3.Length; i++)
{
stringChars3[i] = chars3[random.Next(chars3.Length)];
}
for (int i = 0; i < stringChars6.Length; i++)
{
stringChars6[i] = chars3[random.Next(chars3.Length)];
}
for (int i = 0; i < stringChars9.Length; i++)
{
stringChars9[i] = chars3[random.Next(chars3.Length)];
}
var finalString3 = new String(stringChars3);
var finalString6 = new String(stringChars6);
var finalString9 = new String(stringChars9);
Console.WriteLine("Keys:");
Console.WriteLine();
Console.ReadKey();
Console.WriteLine(finalString + "-" + finalString4 + "-" + finalString7);
Console.WriteLine();
Console.ReadKey();
Console.WriteLine(finalString2 + "-" + finalString5 + "-" + finalString8);
Console.WriteLine();
Console.ReadKey();
Console.WriteLine(finalString3 + "-" + finalString6 + "-" + finalString9);
Console.WriteLine();
Console.ReadKey();
}

Assuming you are looking for "get string of random characters (from given set of characters) that formatted to given specification like 'xxx-xx-xxxx!xxx' where 'x' is random character".
Regex.Replace is a nice way to construct such string - it let you run arbitrary code to construct replacement - so replacing every 'x' with randomly selected character will produce result you seem to be looking for:
var r = new Random();
// convert string to array of strings for individual characters as Replace wants strings
var charsAsStrings = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
.Select(x=>x.ToString()).ToArray();
var result = Regex.Replace("xxx-xxx", "x",
m => charsAsStrings[r.Next(charsAsStrings.Length)]));
Notes:
make sure to read Random number generator only generating one random number to properly instantiate Random.
random numbers/strings are not unique. Presumably you will store them in some sort of list/database and re-generate the once that are not unique
using similarly-looking symbols like 'O' and '0' (or 'I', 'l','1') in strings that may need to be read by humans is not the best idea.

Create a function for the code generation, it makes the main method more readable.
private static readonly Random _random = new Random();
private static string CreateCode()
{
var bytes = new byte[11];
_random.NextBytes(bytes);
string s = BitConverter.ToString(bytes).Replace("-", "");
string result = new StringBuilder(s)
.Insert(18, '-')
.Insert(12, '-')
.ToString();
return result;
}
static void Main(string[] args)
{
const int N = 3;
var codes = new string[N];
for (int i = 0; i < N; i++) {
codes[i] = CreateCode();
Console.WriteLine(codes[i]);
}
}
I use the Random.NextBytes method to generate random bytes. We need 11 of them, because one byte is represented by 2 hex positions.
Your codes are in hexadecimal format, i,e, they contain only the letters A - F and digits. This solution uses the BitConverter to format a byte array as hexadecimal string. It produces strings like ""BD-EB-1F-0C-9B-9E-0C-F5-6E-2E-46". Therefore it is necessary to remove the "-" first.
Then I convert the string into a StringBuilder. The latter one has a Insert method that we can use to insert dashes at the required places. I insert the second one first, so that the index of the other one is not shifted.
You could also simply call Console.WriteLine(CreateCode()); three times and not create the codes array. But if you want to do other things with the codes, like saving them to a file or copy them to the cilpboard, it's better to store them somewhere.

Related

How to randomize the word that been get on the textfile

I want to ask if how can I randomize a word that I've get from the textfile data I made.
I already have the word actually from the textfile and stored into an array of character.
Here's what I have so far
I created a method called Shuffle
void Shuffle(string[] chArr)
{
//Shuffle
for (int i = 0; i < chArr.Length; i++)
{
string tmp = chArr[i].ToString();
int r = Random.Range(i, chArr.Length);
chArr[i] = chArr[r];
chArr[r] = tmp;
}
Debug.Log(chArr);
}
and use it like this
string temp = textArray[rowsToReadFrom[0]];
temp = System.Text.RegularExpressions.Regex.Replace(temp, #"\s", "");
char[] chArr = temp.ToCharArray();
string s = chArr.ToString();
string[] ss = new string[] { s };
Shuffle(ss);
foreach (char c in chArr)
{
testObject clone = Instantiate(prefab.gameObject).GetComponent<testObject>();
clone.transform.SetParent(container);
charObjects.Add(clone.Init(c));
//Debug.Log(c);
}
It still doesn't randomize that word I get from the textfile data.
EDITTED
So far here's what I did
string temp = textArray[rowsToReadFrom[0]];
temp = System.Text.RegularExpressions.Regex.Replace(temp, #"\s", "");
char[] chArr = temp.ToCharArray();
string charResult = "";
for(int i = 0; i < chArr.Length; i++)
{
int ran = Random.Range(0, chArr.Length);
charResult += chArr[ran];
}
Debug.Log(charResult);
foreach (char c in charResult)
{
testObject clone = Instantiate(prefab.gameObject).GetComponent<testObject>();
clone.transform.SetParent(container);
charObjects.Add(clone.Init(c));
//Debug.Log(c);
}
But instead of giving me for example the word "Abandon" it would give me sometimes a randomize word "aaaabn" could someone help me out why?
I will be using Fisher–Yates_shuffle
public static string Shuffle(string str)
{
System.Random random = new System.Random();
var array = str.ToCharArray();
for (int i = 0; i < array.Length; i++)
{
int j = random.Next(i, array.Length);
char temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return String.Join("", array);
}
and to use it simply do
var f = "hello";
Console.WriteLine(Shuffle(f));
Your code is just getting random letters from that word but does not exclude duplicate. What you want instead is randomize the array of chars and convert it back to a string
System.Random rnd = new System.Random();
Char[] randomCharArray = chArr.OrderBy(x => rnd.Next()).ToArray();
string charResult = randomCharArray.ToString();
Unity has its own implementation of Random so be sure you use System.Random
it's most easier if you use a list (let call it initial list), (it may have some performance overheat do to shifts on remove, but i'm wonder if using a linked list would solve that...
Here what you can do if you do as i said:
Fill the list, with your words, or char, or any data which you want to randomize
Create another list or array to store randomized data in (result)
create a while loop, and check while, your initial list Has Item (count > 0)
use Random, and performe rand.Next(0, initialList.Count)
take the item within the index of random number and append it to the result list, (or replace free slot if you are using array)
List<string> initial = new List<string>();
initial.AddRange(data);
Random rand = new Random();
List<string> result = new List<string>();
while (initial.Count > 0) // LINQ: initial.Any()
{
int index = rand.Next(0, initial.Count);
result.Add(initial[index]);
initial.RemoveAt(index);
}
return result;

Randomize string in C#

I am trying to randomize string elements, but my code is repeating strings. Can someone explain what is wrong with my code?
string[] words = Console.ReadLine().Split();
//input = "Welcome and have fun learning programming"
Random number = new Random();
for (int i = 0; i < words.Length; i++)
{
int currRandomNumber = number.Next(0, words.Length);
words[i] = words[currRandomNumber];
}
Console.WriteLine(string.Join(' ', words));
//output = "have learning learning learning learning programming"
I am facing problems with the words repeating, and it is not randomized? If you don't understand what I mean, see the comments which I added in the code. Any help will be appreciated!
The words are repeating because you are doing this:
words[i] = words[currRandomNumber];
The line means "copy the word at index currRandomNumber to the index i". As long as i and currRandomNumber are different, you are guaranteed to have a duplicate word.
What you meant to do was probably to swap the words at currRandomNumber and i:
var temp = words[i];
words[i] = words[currRandomNumber];
words[currRandomNumber] = temp;
// in C# 7, you could swap two values very easily by:
// (words[currRandomNumber], words[i]) = (words[i], words[currRandomNumber]);
Alternatively, you could use a Fisher Yates shuffling algorithm, which makes sure that each permutation have equal chances of occurring:
static void Shuffle<T>(T[] array)
{
int n = array.Length;
for (int i = 0; i < n; i++)
{
int r = i + _random.Next(n - i);
T t = array[r];
array[r] = array[i];
array[i] = t;
}
}
// Shuffle(words);
Alternatively, you can put each of the words into a new list in a random order:
List<string> words = Console.ReadLine().Split().ToList();
//input = "Welcome and have fun learning programming"
Random number = new Random();
var newwords = new List<string> ();
while (words.Count > 0)
{
int currRandomNumber = number.Next(0, words.Count);
newwords.Add( words[currRandomNumber]);
words.RemoveAt(currRandomNumber);
}
Console.WriteLine(string.Join(' ', newwords));

script to mask a string in C#? [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 7 years ago.
Improve this question
I have a code where if i pass a inputdata as "sail" my code will generate a masked output such as "aisl" or "isal". where the output will be jumbled format of input. I want to have a output which should not generate the output with the same exact letters in the input.Below is my current code and please help me with this
string InputData = "123456";
string MaskedData = InputData;
if (MaskedData.Length > 0)
{
// The technique used to mask the data is to replace numbers with random numbers and letters with letters
//char[] chars = new char[InputData.Length];
char[] chars = new char[InputData.Length];
Random rand = new Random(DateTime.Now.Millisecond);
int index = 0;
while (InputData.Length > 0)
{
// Get a random number between 0 and the length of the word.
int next = rand.Next(0, InputData.Length - 1);
// Take the character from the random position and add to our char array.
//chars[index] = InputData[next];
chars[index] = InputData[next];
// Remove the character from the word.
InputData = InputData.Substring(0, next) + InputData.Substring(next + 1);
++index;
}
MaskedData = new String(chars);
}
In this page in dotnetperls.com there is an algorithm that randomizes an array of strings. With a few changes you can use it to randomize a string, using the fact that a string is also an array of chars. Here you have:
static class RandomCharArrayTool
{
static Random _random = new Random();
public static string RandomizeChars(string theString)
{
var arr = theString.ToCharArray();
List<KeyValuePair<int, char>> list = new List<KeyValuePair<int, char>>();
// Add all strings from array
// Add new random int each time
foreach (char s in arr)
{
list.Add(new KeyValuePair<int, char>(_random.Next(), s));
}
// Sort the list by the random number
var sorted = from item in list
orderby item.Key
select item;
// Allocate new string array
char[] result = new char[arr.Length];
// Copy values to array
int index = 0;
foreach (KeyValuePair<int, char> pair in sorted)
{
result[index] = pair.Value;
index++;
}
// Return string generated from copied array
return new string(result);
}
}
You use it like this:
RandomCharArrayTool.RandomizeChars("sail");
Please try with the below code snippet.
Mehtod 1:
string word = "123456";
string temp = word;
string result = string.Empty;
Random rand = new Random();
for (int a = 0; a < word.Length; a++)
{
//multiplied by a number to get a better result, it was less likely for the last index to be picked
int temp1 = rand.Next(0, (temp.Length - 1) * 3);
result += temp[temp1 % temp.Length];
temp = temp.Remove(temp1 % temp.Length, 1);
}
string str = result;
Method2:
var rnd = new Random();
string InputData = "123456";
string MaskedData = new string(InputData.OrderBy(r => rnd.Next()).ToArray());
You have several different approaches, however the easiest may be to implement a SecureString or a Hash. One of those two would encrypt your data quite easily. Under the notion the mask is to hide said contents.
// SecureString
var secure = new SecureString();
foreach(var character in textbox.Text.ToCharArray())
secure.AppendChar(character);
Once your string is placed on memory, it would be encrypted on memory. That is a rough implementation, but documentation will help you refine the approach to your needs.
// Hash (BCrypt for simplicity)
private const int factor = 12;
var hashed = BCrypter.HashPassword(textbox.Text, BCrypter.GenerateSalt(factor));
Another approach would simply be randomization, similar to a word shuffle. Like the other answers have demonstrated.

Assistance in building a regex [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
This question appears to be off-topic because it lacks sufficient information to diagnose the problem. Describe your problem in more detail or include a minimal example in the question itself.
Closed 9 years ago.
Improve this question
I need help building a regex.
In my MVC5 view I have a text area that will contain or more groups of integers which can contain 6, 7, or 8 characters each.
In my controller I need to extract all of these numbers from the input string and put them into an array.
Examples would be:
123456 123457 123458
or
123456
123457
123458
or
123456,123457, 123458
These groups may or may not have 1 or 2 leading zeroes:
00123456, 00123457 123458
This is what I ended up with:
public string[] ExtractWorkOrderNumbers(string myText)
{
var result = new List<string>();
var regex = new Regex(#"( |,)*(\d+)");
var m = regex.Match(myText);
while (m.Success)
{
for (int i = 1; i <= 2; i++)
{
var wo = m.Groups[2].ToString();
if (result.Count == 0)
{
result.Add(wo);
}
else
{
var x = (from b in result where b == wo select b).ToList().Count;
if (x == 0) result.Add(wo);
}
}
m = m.NextMatch();
}
return result.ToArray();
}
Assumption: zero or more spaces and/or commas serve as delimiters.
[TestMethod()]
public void TestMethod3()
{
var myText = "123456 1234567, 123458, 00123456, 01234567";
var regex = new Regex(#"( |,)*(\d+)");
var m = regex.Match(myText);
var matchCount = 0;
while (m.Success)
{
Console.WriteLine("Match" + (++matchCount));
for (int i = 1; i <= 2; i++)
{
Group g = m.Groups[i];
Console.WriteLine("Group" + i + "='" + g + "'");
CaptureCollection cc = g.Captures;
for (int j = 0; j < cc.Count; j++)
{
Capture c = cc[j];
Console.WriteLine("Capture" + j + "='" + c + "', Position=" + c.Index);
}
}
m = m.NextMatch();
}
}
Output:
(For each match, all Group2's are your matches, Group1 is the delimiter)
Match1
Group1=''
Group2='123456'
Capture0='123456', Position=0
Match2
Group1=' '
Capture0=' ', Position=6
Group2='1234567'
Capture0='1234567', Position=7
Match3
Group1=' '
Capture0=',', Position=14
Capture1=' ', Position=15
Group2='123458'
Capture0='123458', Position=16
Match4
Group1=' '
Capture0=',', Position=22
Capture1=' ', Position=23
Group2='00123456'
Capture0='00123456', Position=24
Match5
Group1=' '
Capture0=',', Position=32
Capture1=' ', Position=33
Group2='01234567'
Capture0='01234567', Position=34
By using the named capturing groups feature of regular expressions (Regex), we can extract the data from matching patterns. In your case, we can extract the non-zero integer portion of the text string:
using System.Text.RegularExpressions;
// A pattern consisting of at most two leading zeros followed by 6 to 8 non-zero digits.
var regex = new Regex(#"^[0]{0,2}(?<Value>[1-9]{6,8})$");
var firstString = "123456";
var secondString = "01234567";
var thirdString = "0012345678";
var firstMatch = regex.Match(firstString);
var secondMatch = regex.Match(secondString);
var thirdMatch = regex.Match(thirdString);
int firstValue = 0;
int secondValue = 0;
int thirdValue = 0;
if (firstMatch.Success)
int.TryParse(firstMatch.Groups["Value"].Value, out firstValue);
if (secondMatch.Success)
int.TryParse(secondMatch.Groups["Value"].Value, out secondValue);
if (thirdMatch.Success)
int.TryParse(thirdMatch.Groups["Value"].Value, out thirdValue);
Console.WriteLine("First Value = {0}", firstValue);
Console.WriteLine("Second Value = {0}", secondValue);
Console.WriteLine("Third Value = {0}", thirdValue);
Output:
First Value = 123456
Second Value = 1234567
Third Value = 12345678

generating string from exited characters

I have a character array as shown below :
char[] pwdCharArray = "abcdefghijklmnopqrstuvwxyzABCDEFG" +
"HIJKLMNOPQRSTUVWXYZ0123456789`~!##$%^&*()-_=+[]{}\\|;:'\",<" +
".>/?".ToCharArray();
and from this char array, i want to generate a string of minimum length 7 and all the characters in the string should be from the above char array.
How to do this operation?
What's the maximum length? (You may want to parameterize the methods below to specify a minimum and maximum length.) Here's a simple way of doing it for exactly 7 characters:
Here's the C# version:
public string GeneratePassword(Random rng)
{
char[] chars = new char[7];
for (int i = 0; i < chars.Length; i++)
{
chars[i] = pwdCharArray[rng.Next(pwdCharArray.Length)];
}
return new string(chars);
}
Note that the Random instance should be passed in to avoid the common problem of creating many instances of Random. I have an article describing this problem and ways around it. In essence, you should use one instance of Random per thread - don't create a new instance every time you want to use one, and don't reuse the same instance across multiple threads.
In fact, for a genuine password which is guarding sensitive information, you probably shouldn't be using Random at all, but rather something like RNGCryptoServiceProvider (or less directly, the results of RandomNumberGenerator.Create()). This can be somewhat harder to use, but will give you much more secure random numbers.
In Java it would be pretty similar, but then I'd use SecureRandom (which is fortunately rather easier to use than its .NET counterpart). In this case, you can create a new instance each time:
public String generatePassword() {
char[] chars = new char[7];
SecureRandom rng = new SecureRandom();
for (int i = 0; i < chars.length; i++) {
chars[i] = pwdCharArray[nextInt(pwdCharArray.length)];
}
return new String(chars);
}
Generate 7 random numbers between 0 and yourArray.length -1.
Pick the corresponding char in the array and put it in your final String.
Here is the code with a StringBuilder:
StringBuilder sb = new StringBuilder();
Random random = new Randdom();
for(int i=0; i<7; i++) {
sb.append(pwdCharArray[random.nextInt(0, pwdCharArray.length -1)]);
}
return sb.toString();
(C# example)
Random rand = new Random();
char[] arr = new char[rand.Next(7,15)];
for(int i = 0 ; i < arr.Length ; i++) {
arr[i] = pwdCharArray[rand.Next(pwdCharArray.Length)];
}
string pwd = new string(arr);
Here is a solution in Java, with variable length of the word, and test of working:
import java.util.*;
public class RandomWord {
// Valid characters
private static String VALID_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFG" +
"HIJKLMNOPQRSTUVWXYZ0123456789`~!##$%^&*()-_=+[]{}\\|;:'\",<.>/?";
// Minimal length thw word can have
private static int MIN_LENGTH = 7;
// Maximal length will be MIN_LENGTH + THRESHOLD - 1
private static int THRESHOLD = 10;
// Generate a random number generator.
// The time in millis is used as seed prevents the numbers to be always the same in same order
Random randomGenerator = new Random(System.currentTimeMillis());
public String generateWord () {
// Actual length of the word (from MIN_LENGTH to MIN_LENGTH + THRESHOLD - 1)
int length = MIN_LENGTH + randomGenerator.nextInt(THRESHOLD);
// Loop for every character
StringBuilder word = new StringBuilder();
for (int i = 0; i < length; i++) {
// Appends one more random char
word.append(VALID_CHARACTERS.charAt(randomGenerator.nextInt(VALID_CHARACTERS.length())));
}
// Returns the random word
return word.toString();
}
// Test the class
public static void main (String[] args) {
// Instantiates and tests the class
RandomWord randomWord = new RandomWord();
for (int i = 0; i < 30; i++) {
String word = randomWord.generateWord();
System.out.println(word + " (" + word.length() + ")");
}
}
}

Categories