23 svar
165 visningar
nifesoj är nöjd med hjälpen
nifesoj 25
Postad: 27 okt 2022 10:53

Metodanrop för random number med decimal

Hej

Jag försöker få mitt slumpade tal till decimaltal.

Min metod för den har varit i int först, för den anropas ifrån celciusvärdet i föregående metod. Men då får jag bara upp heltal. (När man väljer 0 för att få en slumpad temperatur)

Så jag har gjort om den till double och anropat den från random-metoden istället men då när man väljer 0 så får jag upp min if med att det är för kallt..

Hur får jag ett slumpat tal till ett decimaltal?

using System;

class Program{

  //Metod för att omvandla fahrenheit till celcius med decimaltal
    public static double Fahr_To_Cel(int fahrenheit){
    double temp = (double)fahrenheit;
    temp = (temp - 32.0)*5.0/9.0;
    return temp;
  }
  //Metod för att välja en lagom temp åt användaren
    public static double Fahr_To_Cel(double fahrenheit){
    Random randomNumber = new Random();
    double randnumber = randomNumber.Next(83,88);
    return randnumber;
  }
  //Huvudmetod
    public static void Main (string[] args) {
    
    double celcius = 0;
    int fahrenheit = 0;
    double randnumber = 0;
      
    Console.Clear();
    //Instruktioner till användaren
    Console.WriteLine ("Welcome to The Sauna.\nSelect a temperature in Fahrenheit.");
    Console.WriteLine("If you want to choose a good temperature randomly, select 0 (zero)");
    Console.WriteLine();
    //Loop tills lagom temperatur
    do{
      Console.Write("\nChoose your temperature: ");
      //Undantagshantering om användaren skriver in annat än heltal
      try{
        fahrenheit = Convert.ToInt32(Console.ReadLine());
        celcius = Fahr_To_Cel(fahrenheit);
      }
      catch (Exception){
        Console.Write("Whole digits please. Enter your temperature again.");
        continue;
      }
      //Metodanrop
      celcius = Fahr_To_Cel(fahrenheit);
      celcius = Math.Round(celcius,1);
      randnumber = Fahr_To_Cel(fahrenheit);
      randnumber = Math.Round(randnumber,1);
      
      //Slumpat tal väljer temperaturen mellan 83.0 och 88.0
      if (fahrenheit == 0)
        randnumber = Fahr_To_Cel(fahrenheit);
      
      if (celcius < 82){
        Console.WriteLine("A bit too cold with "+celcius+"C...Crank it up a bit.");
      }
      else if (celcius > 87){
        Console.WriteLine(+celcius+ "C. Flaming hot! Lower your temperature.");
      }
        
    }while (celcius < 82 || celcius > 87);

    Console.WriteLine("It´s now "+celcius + "C.\nEnjoy the sauna! Temperature is good.");
    Console.ReadKey();
  }
}
Laguna Online 28565
Postad: 27 okt 2022 11:04

Varför har du en variant av Fahr_To_Cel som slumpar, för att argumentet är ett flyttal som inte används? Det är mycket förvirrande. Låt slump-metoden ha ett eget namn.

Fermatrix 7841 – Fd. Medlem
Postad: 27 okt 2022 11:12

Fixa också till din indentering. Om du har en IDE så kan man fuska och låta den fixa allting åt dig men du ska inte skapa en vana att skriva din kod så här.

nifesoj 25
Postad: 27 okt 2022 11:17

Sant, har ändrat till annat namn nu.

nifesoj 25
Postad: 27 okt 2022 11:20

Hur kan jag få argumentet att användas?

nifesoj 25
Postad: 27 okt 2022 11:26

är indenteringen fel? Använder mig av en IDE. Hur kan koden då köras?

Fermatrix 7841 – Fd. Medlem
Postad: 27 okt 2022 11:38 Redigerad: 27 okt 2022 11:38

Om du hade kodat i Python så hade din kod inte fungerat. 

Eftersom man i C - relaterade språk använder måsvingar så måste man inte indentera sin kod, man kan strunta i det. Problemet är att du kommer inte ha en aning själv vad som sker när du börjar introducera nestlade loopar men olika logiska satser. Ingen annan kommer heller fatta vad det är du skrivit utan att anstränga sig enormt mycket bara för att veta vilket block som tillhör vilken måsvinge.  

Laguna Online 28565
Postad: 27 okt 2022 11:40

Jag tycker indenteringen är ganska läslig.

Om du ska slumpa fram ett resultat behöver du inte skicka in nåt argument, eller hur?

nifesoj 25
Postad: 27 okt 2022 11:43

Nej det behöver jag inte.

Gjorde såhär för att testa om jag kan få slumptalet som decimaltal, som med de andra talen/temperaturerna..men det verkat ju inte fungera.

anders_k 234
Postad: 27 okt 2022 20:46 Redigerad: 27 okt 2022 20:51

Har du provat metoden random.NextDouble() istället?

Den ger ett slumptal mellam 0.0 och 1.0

var randomNumber = new Random();
double r = randomNumber.NextDouble() * (88-83) + 83;

Normalt skall du bara gör en random generator som använder i hela programmet, inte göra en vid varje anrop till Fahr_To_Cel.

Gör den till en medlem i Program klassen istället sedan ropar du bara randomNumber.NextDouble vid varje anrop till Fahr_To_Cel.

nifesoj 25
Postad: 27 okt 2022 21:25

Tack, den ska jag använda.

Men du säger först att jag inte ska anropa vid varje Far_To_Cel och sen ska jag det. Bara för att den ligger under Mainmetoden nu istället?

Har försökt att få /förstå det här med anrop, speciellt på slumptalet nu här efter jag testat din NextDouble men jag förstår det nog inte riktigt..för det funkar inte som jag vill.

Den skriver fortfarande ut som om jag hade valt 0 grader Fahrenheit, vilket då blir minusgrader i Celsius. Tanken är att den ska välja något av mina slumptal..jag ropar på fel sak tydligen och jag kan inte se lösningen.

Laguna Online 28565
Postad: 27 okt 2022 21:28

Hur ser koden ut nu?

nifesoj 25
Postad: 27 okt 2022 21:34
using System;

class Program{

  //Metod för att omvandla fahrenheit till celcius med decimaltal
    public static double Fahr_To_Cel(int fahrenheit){
    double temp = (double)fahrenheit;
    temp = (temp - 32.0)*5.0/9.0;
    return temp;
  }
  
  //Huvudmetod
    public static void Main (string[] args) {

      var randomNumber = new Random();
      double r = randomNumber.NextDouble() * (88-83) + 83;
      
      double celcius = 0;
      int fahrenheit = 0;
      
    Console.Clear();
    //Instruktioner till användaren
    Console.WriteLine ("Welcome to The Sauna.\nSelect a temperature in Fahrenheit.");
    Console.WriteLine("If you want to choose a good temperature randomly, select 0 (zero)");
    Console.WriteLine();
    //Loop tills lagom temperatur
    do{
      Console.Write("\nChoose your temperature: ");
      //Undantagshantering om användaren skriver in annat än heltal
      try{
        fahrenheit = Convert.ToInt32(Console.ReadLine());
        celcius = Fahr_To_Cel(fahrenheit);
      }
      catch (Exception){
        Console.Write("Whole digits please. Enter your temperature again.");
        continue;
      }
      //Metodanrop
      celcius = Fahr_To_Cel(fahrenheit);
      celcius = Math.Round(celcius,1);
      
      //Slumpat tal väljer temperaturen mellan 83.0 och 88.0
      if (fahrenheit == 0)
        r = randomNumber.NextDouble();
        r = Math.Round(r,1);
        
      if (celcius < 82){
        Console.WriteLine("A bit too cold with "+celcius+"C...Crank it up a bit.");
      }
      else if (celcius > 87){
        Console.WriteLine(+celcius+ "C. Flaming hot! Lower your temperature.");
      }
        
    }while (celcius < 82 || celcius > 87);

    Console.WriteLine("It´s now "+celcius + "C.\nEnjoy the sauna! Temperature is good.");
    Console.ReadKey();
  }
}
Laguna Online 28565
Postad: 27 okt 2022 21:39

Du sätter r till ett slumptal men sen gör du ingenting med r. Ska det vara celcius som blir slumpat?

(Det stavas Celsius.)

nifesoj 25
Postad: 27 okt 2022 21:46

Slumptalen är i Celsius.

Skriver man in en 0 (nolla) så är det menat i Fahrenheit.

Hur menar du att jag inte gör något med r? Under min första if så ropar jag på r, slumpat tal.

Laguna Online 28565
Postad: 27 okt 2022 21:53

Du gör 

r = Math.Round(r,1);

och efter det använder du inte r.

nifesoj 25
Postad: 27 okt 2022 22:23

Måste jag använda mig av celcius-vaiabeln tillsammans med r?

nifesoj 25
Postad: 27 okt 2022 22:33

Eller en parameter för r?

Laguna Online 28565
Postad: 28 okt 2022 07:26

Om du vill att 'celcius' ska innehålla slumptalet får du sätta 'celcius' till slumptalet. Kanske

celcius = r;

anders_k 234
Postad: 28 okt 2022 08:20

Detta är inte rätt

      if (fahrenheit == 0)
        r = randomNumber.NextDouble();
        r = Math.Round(r,1);

r blir [0,1] sedan avrundar du?

nifesoj 25
Postad: 28 okt 2022 10:21

Nu funkar denna men bara när jag skriver in 0 (noll) första gången. Jag kan inte skriva in 0 andra gången, då verkar det som att celcius = r inte gäller längre. Får upp 0,1 - 0,9 slumpat.

if (fahrenheit == 0)
        celcius = r;
        r = randomNumber.NextDouble();
        celcius = Math.Round(celcius,1);
Laguna Online 28565
Postad: 28 okt 2022 10:31

De där gränserna 83 och 88 använder du ju bara första gången du sätter r, i början av Main. Sedan blir det nåt mellan 0 och 1.

nifesoj 25
Postad: 28 okt 2022 12:05

är det så bara eller menar du att jag behöver ange 83 - 88 senare i koden för att det inte ska hoppa över till 0,1-0,9?

Laguna Online 28565
Postad: 28 okt 2022 14:03

Programmet gör ju vad du säger. Säger du inte " * (88-83) + 83" så gör det inte det. Hur skulle det kunna veta att det är det du vill?

Svara Avbryt
Close