• 0

Java: Generate the alphabet in random order, no duplicates


Question

Hi guys,

I am taking an introductory programming course and need a bit of help. The assignment is to have the Java program read a message (I am assuming from a .dat file, not quite sure). The program creates substitutes each random letter with a different letter chosen at random by the computer. If the letter M is chosen to replace the letter P in the message, then M replaces P in every instance of the message.

Right now, I just need help with generating a set of the 26 letters ordered randomly without duplicates. Here is what I have:

  Quote
import java.util.Random;

public class encrypt {

public static void main(String[] args) {

char [] alphabet =

{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

char [] substitute =

{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

boolean done=false;

Random generator = new Random();

int i, j, k, random;

while(done==false) {

for(i=0; i<=25; i++) {

random = generator.nextInt(25);

substitute=alphabet[random];

for(j=0; j<=i; j++) {

while(substitute[j]==substitute) {

random = generator.nextInt(25);

if(substitute[j]!=substitute) {

substitute=alphabet[random];

}

}

}

}

for(k=0; k<=25; k++) {

System.out.print(substitute[k] + ", ");

}

done=true;

}

}

}

Right now the program does nothing. If I remove the last for loop with j as the counter and everything within that for loop, I get an output of 26 letters randomly chosen, but there are duplicates. The last for loop is supposed to say something like, "If the randomly generated letter (substitute) has appeared before in substitute[], then generate a new random number until it is no longer a duplicate of a previous number, at which point the letter which corresponds to the random number is stored in substitute.

So if you could give me some suggestions it would be much appreciated. If I am overcomplicating things and there is a much easier way to do this, please guide me in the right direction.

Thanks,

Noah

EDIT: Spacing in the program code isn't working. Looks fine while I'm editing it though. What's wrong?

EDIT 2: See here for my code, correctly formatted.

Edited by -Noah-

Recommended Posts

  • 0

Your way seems a little strange unless I am missing something. Why don't you just have an array for the alphabet and then just pick a letter at random when you need it. From what I understood you don't actually need an entire randomised alphabet.

  • 0
  Zapadlo said:
Your way seems a little strange unless I am missing something. Why don't you just have an array for the alphabet and then just pick a letter at random when you need it. From what I understood you don't actually need an entire randomised alphabet.

Thanks for the response.

How would I make sure that I do not pick the same letter from the alphabet array more than once?

  • 0

You could always switch to using a LinkedList instead of an array, when you choose a letter, you just remove it from the list.

The size of the list would decrease each time, so you'd need to generate a random number using the variable linkedlist.size() instead of 25.

  • 0

I would stick to the array personally and have another with the letters already used so that when a new random letter is picked it is checked against those in the already used array.

LinkedLists - /covers eyes and shrieks

Sorry, personal disposition :)

  • 0
  Zapadlo said:
I would stick to the array personally and have another with the letters already used so that when a new random letter is picked it is checked against those in the already used array.

LinkedLists - /covers eyes and shrieks

Sorry, personal disposition :)

why would you want to maintain 2 arrays versus a single shrinking array that will only ever have letters you can use?

not to mention random doesn't mean true random, you could (however unlikely this is) end up randomizing the same already used letter multiple times in a row

  • 0
  ecstasis said:
why would you want to maintain 2 arrays versus a single shrinking array that will only ever have letters you can use?

not to mention random doesn't mean true random, you could (however unlikely this is) end up randomizing the same already used letter multiple times in a row

I can see what you are saying, and it is true, but I am compelled to say, so?

  • 0

That was my problem: I knew there would be a chance that it could generate the same letter again. That's why I made my code the way I did. Also, I don't see how creating a "used letters" array would be any better than my method.

The only problem is, why doesn't my code work!?!?

How would I go about creating a linked list in Java? I looked online and unless I am missing something, it looks pretty complicated.

  • 0

import java.util.Random;
import java.io.*;
import java.lang.*;
import java.lang.String.*;



public class encrypt {

public static void main(String[] args) {

char [] alphabet =
{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
char [] substitute =
{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
char [] used =
{'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
boolean done=false;
Random generator = new Random();
int i, j, k, random, count;

count = 0;

System.out.print("Enterring: ");

	  //  open up standard input
	  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	  String input = null;

	  //  read the username from the command-line; need to use try/catch with the
	  //  readLine() method
	  try {
		 input = br.readLine();
	  } catch (IOException ioe) {
		 System.out.println("IOr");
		 System.exit(1);
	  }

	  //loop
	  for (int l = 0; l &lt; input.length(); l++)	{
		  count++;

  }
		  System.out.println(count);

		for(int p = 0; p &lt;count; p++)	{

			int result = 0 + (int) ( Math.random()*(26) );

			char temp = alphabet[result];

			char temp2 = '1';
			int o = 0;
			while(temp2 != '0')	{
			//for(int o = 0; o &lt; used.length(); o++)	{

				temp2 = used[o];

				if(temp == temp2) {					
					result = 0 + (int) ( Math.random()*(26) );
				}
				o++;
			}
			char temp3;
			temp3 = input.chatAt(count); // No idea why this doesn't work
			alphabet[result] = temp3;


			count++;
		}


	  System.out.println(input);


while(done==false) {
for(i=0; i&lt;=25; i++) {
random = generator.nextInt(25);
substitute[i]=alphabet[random];
for(j=0; j&lt;=i; j++) {
while(substitute[j]==substitute[i]) {
random = generator.nextInt(25);
if(substitute[j]!=substitute[i]) {
substitute[i]=alphabet[random];
}
}
}
}
for(k=0; k&lt;=25; k++) {
System.out.print(substitute[k] + ", ");
}
done=true;
}
}
}

Something like that, only charAt doesn't work, sorry I'm tired so if you can fix that part I can check the rest of the code.

Oh and this way you have all the letters you have used in an array for printing/whatever.

  Quote
So... then you don't have to compare and try the operation again...

All it is, is a for loop running through used array in case you pick a letter that has been already used you just pick a new random letter.

Edit: Actually, it only checks once and if it picks a letter that already occured again it proceeds when it shouldn't.

Also not accounting for spaces... /sigh there is actually quite a lot, hope it helps though.

Edited by Zapadlo
  • 0
  ecstasis said:
why would you want to maintain 2 arrays versus a single shrinking array that will only ever have letters you can use?

not to mention random doesn't mean true random, you could (however unlikely this is) end up randomizing the same already used letter multiple times in a row

Because LinkedLists seem a bit advanced for someone doing basic stuff like this in an introduction to a java course. Anyway:

Seems pretty sloppy (but it's 12:35am), but here it is. It's commented and stuff so you actually have a clue on what's going on. BTW, did you know you can declare variables while in for-loops? You don't need to declare "int i" as a member variable if you're just going to use it for for loops. Java should also just destroy the integer once you're out of the for loop, meaning you can reuse int i in another for loop if you so wish.

import java.util.Random;

public class encrypt {
  public static void main(String[] args) {
	char [] alphabet =  {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
	char [] substitute = {'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'};  //this should be 26 dots, please check
	int [] numbers = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  //this should be 26 zeros, please check to see if this correct!!

	for (int i=0; i&lt;=25; i++) {
	  random = generator.nextInt(25);
	  //keep running this if-else until we find a number we haven't used before
	  do {
		//if we find a number we haven't used before
		if (numbers[random] == 0) { 
		  numbers[random] = random; //then assign that position in the array that number (i.e. position 10 in the array will now have the number 10)
		  substitute[i] = alphabet[random];  //assign the current position of the substitute alphabet array the random letter from the real alphabet
		}
		else {
		  random = generator.nextInt(25); //if we hit a number we've already used, get another one
		}
	  } while (numbers[random] != 0)
	}
	for(int i=0; i&lt;=25; i++) {
	  System.out.print(substitute[i] + ", "); //print out your brand new randomised alphabet!
	}
  }
}

I'll admit, I have no idea if this works or not, as I don't have the java compiler on my computer any more (haven't done java in about a couple of years), but this should work. There's no harm in compiling it yourself though, just shout out any errors if there are any.

  • 0

heres my attempt, not compiled but i don't imagine its too far off (could be wrong tho)

private String jumble(String[] original) {
	Random gen = new Random();
	String[] alphabet = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "x", "y", "z", " "};
	ArrayList alphabetaGenList = new ArrayList(Arrays.asList(alphabet));
	Hashtable newAlphabet = new Hashtable();
	StringBuffer jumbled = new StringBuffer();
		int randomAlphabetLetter = 27;

		//oops made a mistake with the random, 2nd edit
	for (int i = 0; i &lt; 27; i++) {
				int r = gen.nextInt(randomAlphabetLetter--);
		newAlphabet.put(alphabet[i], alphabetGenList.get(r));
		alphabetGenList.remove(r);
	}

	for (int i = 0; i &lt; original.length; i++) {
				jumbled.append(newAlphabet.get(original[i]));
	}	

	return jumbled.toString();
}

edit...

i guess thats a bit overkill since it converts the string too, but not many changes just to do the alphabet

Edited by ecstasis
  • 0

Thanks guys for all the replies.

Zapadlo: I don't know if you realized this, but you have chatAt instead of charAt. :p Even with that change, it throws an error:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5

at java.lang.String.charAt(Unknown Source)

at encrypt.main(encrypt.java:66)

The string index out of range value is always the number of characters that I have typed for the string. I'm guessing my code at the bottom was not supposed to be there. No problem, though. I live in the US, so it's quarter of 10 now. Didn't mean to give you guys Java code problems in the middle of the night! Is Neowin UK based?

-Noah

  • 0

Teej: I added a semicolon after the while statement. No errors, but here are some examples of the output:

Output 1. W, C, U, H, E, D, F, Q, A, ., T, K, ., ., J, ., X, ., L, ., R, ., O, ., ., .,

Output 2. V, ., P, ., H, K, Q, ., D, S, ., ., G, J, R, F, N, ., M, B, ., Y, ., ., W, U,

Output 3. X, O, W, I, P, ., U, G, Q, R, F, ., ., V, A, B, ., ., K, ., Y, H, ., E, T, M,

I cant figure out what is wrong, most likely because I don't exactly know what is going on with the do while. Does the while statement at the end tell the program to go through the do again under the specified conditions? If you have any more ideas for fixing this, they are welcome!

About the int within the for-loop, my teacher says that it wastes memory and that you should define those variables first, out of the for-loop (?). I'm guessing she's wrong. :laugh:

  • 0
  -Noah- said:
About the int within the for-loop, my teacher says that it wastes memory and that you should define those variables first, out of the for-loop (?). I'm guessing she's wrong. :laugh:

i'm not sure it would make a difference either way since those variables would go to the garbage collector once they are out of scope (i don't know exactly how java deals with).

  • 0

These solutions are all overkill...

- Make an ArrayList containing all 26 letters.

- generate random number from 0 to List.size()-1.

- List.get(randomNumber)

- List.remove(randomNumber)

loop and restart at step 2 until List.size() returns 0.

import java.util.*;

class alphaRandom {

	public static void main(String[] args) {

	ArrayList&lt;Character&gt; al = new ArrayList&lt;Character&gt;();
	Random gen = new Random();
	int num;

	for(int i = 65; i &lt;= 90; i++) {
		al.add((char)i);
	}

	while(al.size() &gt; 0) {
		num = gen.nextInt(al.size());
		System.out.print(al.get(num));
		al.remove(num);
	}
 }
}

Edited by Tech God
  • 0

I had to do this for school too.

Stick to your method of arrays. LinkedLists are a pain for this.

I say keep 1 array list(alphabet).

Then create a random number from 0 - array.length()-1

after that just loop thru and remove the letter that your random number is. Havent done java in a few months so I dont know the EXACT array command to say "array.get? or etc".

Idk, but logically I would do it this way. Easier.

  • 0
  Tech God said:
These solutions are all overkill...

- Make an ArrayList containing all 26 letters.

- generate random number from 0 to List.size()-1.

- List.get(randomNumber)

- List.remove(randomNumber)

loop and restart at step 2 until List.size() returns 0.

import java.util.*;

class alphaRandom {

	public static void main(String[] args) {

	ArrayList&lt;Character&gt; al = new ArrayList&lt;Character&gt;();
	Random gen = new Random();
	int num;

	for(int i = 65; i &lt;= 90; i++) {
		al.add((char)i);
	}

	while(al.size() &gt; 0) {
		num = gen.nextInt(al.size());
		System.out.print(al.get(num));
		al.remove(num);
	}
 }
}

If you want to same some programming time, al.remove(num) will also return the object it's removing - so System.out.print(al.remove(num)) should work.

  • 0
  -Noah- said:
Teej: I added a semicolon after the while statement. No errors, but here are some examples of the output:

Output 1. W, C, U, H, E, D, F, Q, A, ., T, K, ., ., J, ., X, ., L, ., R, ., O, ., ., .,

Output 2. V, ., P, ., H, K, Q, ., D, S, ., ., G, J, R, F, N, ., M, B, ., Y, ., ., W, U,

Output 3. X, O, W, I, P, ., U, G, Q, R, F, ., ., V, A, B, ., ., K, ., Y, H, ., E, T, M,

I cant figure out what is wrong, most likely because I don't exactly know what is going on with the do while. Does the while statement at the end tell the program to go through the do again under the specified conditions? If you have any more ideas for fixing this, they are welcome!

About the int within the for-loop, my teacher says that it wastes memory and that you should define those variables first, out of the for-loop (?). I'm guessing she's wrong. :laugh:

Haha, I am a complete prat. I've made a couple of changes. Basically, the do-while loop was running the code within the loop while the random number isn't zero, meaning, if the position was being used, then it would generate a random letter until it wasn't being used, hence why you get the odd gaps. This new code does the opposite of this (runs the code within the loop until we get a random letter which isn't being used). I also changed all of the numbers to -1 because we would run into an infinite loop as position 0 would never be allowed.

There are three arrays: the alphabet array, the number array and the substitute alphabet array.

The number array is filled with -1s at the beginning, but as the for loop progresses, the number array gets filled up with numbers between 0-25.

Each time the code goes through the loop, it checks to see if that position in the array isn't -1 (i.e. isn't used), and if it isn't -1, then fill that position in the array with the random number, and then take whatever letter is in that position in the alphabet array, and apply it to the next space in the substitute alphabet array.

If the position in the number array ISN'T -1, then we generate a random number and the do-while loop returns to the beginning and we do the process again.

The do-while keeps doing this until we find a number which isn't -1, at which point, the for loop increments i and we start at the beginning of the code within the for-loop.

import java.util.Random;

public class encrypt {
  public static void main(String[] args) {
	char [] alphabet =  {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
	char [] substitute = {'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'};  //this should be 26 dots, please check
	int [] numbers = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};  //this should be 26 -1s, please check to see if this correct!!

	for (int i=0; i&lt;=25; i++) {
	  random = generator.nextInt(25);
	  //keep running this do-while until we find a number we haven't used before
	  do {
		//if we find a number we haven't used before
		if (numbers[random] == -1) { 
		  numbers[random] = random; //then assign that position in the array that number (i.e. position 10 in the array will now have the number 10), so it's considered to be used
		  substitute[i] = alphabet[random];  //assign the current position of the substitute alphabet array the random letter from the real alphabet
		}
		else {
		  random = generator.nextInt(25); //if we hit a number we've already used, get another one
		}
	  } while (numbers[random] == -1);
	}
	for(int i=0; i&lt;=25; i++) {
	  System.out.print(substitute[i] + ", "); //print out your brand new randomised alphabet!
	}
  }
}

Also, as for what your teacher says, what the hell? Forgive me if I'm wrong, but I'm really certain Java's automatic trashing would destroy the integer as soon as we get outside of the for loop, as opposed to at program termination, meaning it's more efficient to do it that way in this particular instance. Unless you need to use that specific integer value for another task outside of the for loop, declaring it outside of there is pointless.

Regardless of whether it trashes it or not after the for loop, though, it just makes the code neater to actually create the integer for a for-loop in the for-loop, instead of at the beginning, when it may not be needed at all. This is especially true if you have a for-loop within an if-else (as the for-loop may never be executed, meaning you've just wasted memory on declaring an integer which won't be used), or if you're using for-loops in object oriented code, which may not be called very often. Also, if you're using quite a few for loops, you don't want to have to do something like:

int i = 0;	//this integer is for a for loop that does this
int j = 0;		 //this integer is for a for-loop that does that
...
int l = 0;	//this integer is for yet another for-loop that does this thing somewhere in the code, I forget where it is now

Edited by The Teej
  • 0

int variables are primitive types, not Objects and are not created on the heap or garbage collected. They are allocated on the stack when coming into scope and thus released then they go out of scope. Teacher is talking rubbish - an int occupies the same space on the stack wherever it is defined, it just occupies that space for less time when its scope is smaller. And is anyone seriously worrying about 4 bytes of memory in 2009?

  • 0

Obviously the teacher is thinking about :

for (blabla) {
	Object o = new Object();
}

vs

Object o = new Object();
for (blabla) {
}

Here the latter is more efficient since Object() is allocated and constructed only once. If you can move any initialization out of a loop, it's always more efficient to do so. However, doing :

Object o;
for (blabla) {
	o = new Object();
}

is no performance improvement as the object still needs reallocation and construction each time through the loop. The reference o itself is statically allocated, i.e. it's merely a stack pointer increment at the beginning of the method and a decrement at the end, it makes no difference where you declare it in the method.

As for primitive types like int, there is no allocation and no construction involved, so from a performance standpoint it doesn't matter where they are declared within a method. Actually one should try to reduce the scope of variables as much as possible, so here declaring it inside the loop is what makes the most sense since that's the only place where it's supposed to be accessible.

In C++ the question might be different (and I'm unsure about the details), but here we're talking about Java not C++.

Show this to your teacher. :p

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Microsoft 365 Word gets SharePoint eSignature, now you can ditch third-party signing tools by Paul Hill Microsoft has just announced that it will be rolling out an extremely convenient feature for Microsoft 365 customers who use Word throughout this year. The Redmond giant said that you’ll now be able to use SharePoint’s native eSignature service directly in Microsoft Word. The new feature allows customers to request electronic signatures without converting the documents to a PDF or leaving the Word interface, significantly speeding up workflows. Microsoft’s integration of eSignatures also allows you to create eSignature templates which will speed up document approvals, eliminate physical signing steps, and help with compliance and security in the Microsoft 365 environment. This change has the potential to significantly improve the quality-of-life for those in work finding themselves adding lots of signatures to documents as they will no longer have to export PDFs from Word and apply the signature outside of Word. It’s also key to point out that this feature is integrated natively and is not an extension. The move is quite clever from Microsoft, if businesses were using third-party tools to sign their documents, they would no longer need to use these as it’s easier to do it in Word. Not only does it reduce reliance on other tools, it also makes Microsoft’s products more competitive against other office suites such as Google Workspace. Streamlined, secure, and compliant The new eSignature feature is tightly integrated into Word. It lets you insert signature fields seamlessly into documents and request other people’s signatures, all while remaining in Word. The eSignature feature can be accessed in Word by going to the Insert ribbon. When you send a signature request to someone from Word, the recipient will get an automatically generated PDF copy of the Word document to sign. The signed PDF will then be kept in the same SharePoint location as the original Word file. To ensure end-to-end security and compliance, the document never leaves the Microsoft 365 trust boundary. For anyone with a repetitive signing process, this integration allows you to turn Word documents into eSignature templates so they can be reused. Another feature that Microsoft has built in is audit trail and notifications. Both the senders and signers will get email notifications throughout the entire signing process. Additionally, you can view the activity history (audit trail) in the signed PDF to check who signed it and when. Finally, Microsoft said that administrators will be able to control how the feature is used in Word throughout the organization. They can decide to enable it for specific users via an Office group policy or limit it to particular SharePoint sites. The company said that SharePoint eSignature also lets admins log activities in the Purview Audit log. A key security measure included by Microsoft, which was mentioned above, was the Microsoft 365 trust boundary. By keeping documents in this boundary, Microsoft ensures that all organizations can use this feature without worry. The inclusion of automatic PDF creation is all a huge benefit to users as it will cut out the step of manual PDF creation. While creating a PDF isn’t complicated, it can be time consuming. The eSignature feature looks like a win-win-win for organizations that rely on digital signatures. Not only does it speed things along and remain secure, but it’s also packed with features like tracking, making it really useful and comprehensive. When and how your organization gets it SharePoint eSignature has started rolling out to Word on the M365 Beta and Current Channels in the United States, Canada, the United Kingdom, Europe, and Australia-Pacific. This phase of the rollout is expected to be completed by early July. People in the rest of the world will also be gaining this time-saving feature but it will not reach everyone right away, though Microsoft promises to reach everybody by the end of the year. To use the feature, it will need to be enabled by administrators. If you’re an admin who needs to enable this, just go to the M365 Admin Center and enable SharePoint eSignature, ensuring the Word checkbox is selected. Once the service is enabled, apply the “Allow the use of SharePoint eSignature for Microsoft Word” policy. The policy can be enabled via Intune, Group Policy manager, or the Cloud Policy service for Microsoft 365 Assuming the admins have given permission to use the feature, users will be able to access SharePoint eSignatures on Word Desktop using the Microsoft 365 Current Channel or Beta Channel. The main caveats include that the rollout is phased, so you might not get it right away, and it requires IT admins to enable the feature - in which case, it may never get enabled at all. Overall, this feature stands to benefit users who sign documents a lot as it can save huge amounts of time cumulatively. It’s also good for Microsoft who increase organizations’ dependence on Word.
    • It's always good to have an option to secure your stuff to another medium. I did that with DVD/CD collection, and run my own media server now. It's more convenient that way and no need for separate players anymore.
    • Google Search AI Mode gets support for data visualization and custom charts by Aditya Tiwari Google announced it is rolling out support for data visualizations and graphs for finance-related queries in Google Search's AI Mode. Introduced last month at the Google I/O 2025 keynote, the feature lets you analyze complex datasets and create custom charts simply using natural language prompts. The updated AI Mode lets you compare and analyze information over a specific period, Google explained. It generates interactive graphs and provides a comprehensive explanation for your questions. AI Mode utilizes Gemini's multimodal capabilities and multi-step reasoning approach to comprehend the question's intent while accessing historical and real-time information relevant to the question. For instance, instead of manually researching individual companies and their stock prices, you can use AI Mode to compare the stock performance of different companies for a specific year. Once the graph is generated, you can choose the desired time period using the mouse cursor and ask follow-up questions based on the data presented. These new data visualizations for finance queries are available to users who have enabled the AI Mode experiment in Labs. AI Mode was introduced earlier this year as an experimental feature in the US. The feature is an upgraded version of AI Overviews, and Google closely worked with AI power users through the initial development process. It uses the “query fan-out” technique to perform multiple related searches across subtopics and different data sources, then combines them to come up with a comprehensive response. Google updated AI Mode last month to use a custom version of the latest Gemini 2.5 model. It added several new features, including Deep Search, live capabilities, agentic capabilities of Project Mariner, a new shopping experience, and the ability to add personal context by linking Google apps. The search giant is planning to turn AI Mode into its bread and butter. It has begun testing ads for the feature, which will appear below and be integrated into AI Mode responses where relevant.
    • Guys, you should find another way to promote your deals... It's the third article in the last months that promote this deal for an upgrade from 10. Considering that upgrade from 10 to 11 is free it's a total non-sense.
    • Store should be a shrine of useful applications, vetted and verified. Easily sorted by publisher. Windows should start with not much installed and have things as options in the store. Not the wild west mess that it is. You could delete 95%+ of the crap on there and no one would notice. They need to add a better UI to the updates, it's awful right now.
  • Recent Achievements

    • Week One Done
      luxoxfurniture earned a badge
      Week One Done
    • First Post
      Uranus_enjoyer earned a badge
      First Post
    • Week One Done
      Uranus_enjoyer earned a badge
      Week One Done
    • Week One Done
      jfam earned a badge
      Week One Done
    • First Post
      survivor303 earned a badge
      First Post
  • Popular Contributors

    1. 1
      +primortal
      432
    2. 2
      +FloatingFatMan
      239
    3. 3
      snowy owl
      213
    4. 4
      ATLien_0
      211
    5. 5
      Xenon
      157
  • Tell a friend

    Love Neowin? Tell a friend!