Playerprefs across Scenes

Hello everyone,
I am using playerprefs to save a single variable. I have several factors affecting this variable across several scenes. For instance, in scene a, script a is modifying the variable, but in scene b, script b is also modifying the variable. However, for some reason, the variable does not save between scenes. Does anyone have any troubleshooting advice? My scripts are below: (sorry for them being so long. I thought giving more info was better than giving less. If you need anything else, let me know.)
using System.Collections;

public class CarrotCount : MonoBehaviour 
{
	public float x;
	public float y;
	public float z;
	public float unknown;
	public int carrotnumber;	// important


	void Start ()
	{
		StartCoroutine (fiveseconds ());
		carrotnumber = PlayerPrefs.GetInt ("carrotnumber", 10);
		Debug.Log (carrotnumber);
	}

//	public void PLUS1 ()
//	{
//		Debug.Log ("Plus 1 carrot");
//		carrotnumber += 1;
//		Debug.Log (carrotnumber);
//		PlayerPrefs.SetInt ("carrotnumber", carrotnumber);
//
//	}
	void OnGUI () {
		GUI.Box (new Rect (x, y, z, unknown), "Carrots:"+ carrotnumber);
	}

	void Update ()
	{

//PlayerPrefs.SetInt ("carrotnumber", carrotnumber);
	//	carrotnumber = PlayerPrefs.GetInt ("carrotnumber");
	}

	IEnumerator fiveseconds ()
	{
		yield return new WaitForSeconds (1) ;
		PlayerPrefs.SetInt ("carrotnumber", carrotnumber);
		PlayerPrefs.Save ();
		Debug.Log (carrotnumber);
		StartCoroutine (fiveseconds ());
	}
	
}

script a:

using System;
using UnityEngine;
using UnityEngine.Advertisements;

public class test1 : MonoBehaviour {
	public int xdist = 10;
	public int ydis = 10;
	public CarrotCount _carrotcount;

	void Awake() {
		if (Advertisement.isSupported) {
			Advertisement.Initialize ("64925");
		} else {
			Debug.Log("Platform not supported");
		}
	}
	
	void OnGUI() {
		if(GUI.Button(new Rect(xdist, ydis, 85, 40), Advertisement.IsReady() ? "Free Carrots" : "Waiting...")) {
			// Show with default zone, pause engine and print result to debug log
			Advertisement.Show(null, new ShowOptions {
				resultCallback = result => {
					Debug.Log(result.ToString());
					_carrotcount.carrotnumber += 5;
				}
			});
		}
	}
}

script b:

using UnityEngine;
using System.Collections;

public class Ifclicked : MonoBehaviour {

	public MoveCarrot _MoveCarrot;
	public CarrotCount _CarrotCount ;
	public string use;
	public killmole _killmole;
	GameObject carrotmaster;

	void Start ()
	{
//		carrotmaster = GameObject.Find ("carrotmaster");
//		CarrotCount _CarrotCount = (CarrotCount) carrotmaster.GetComponent (typeof(CarrotCount));
	}
	void OnMouseDown ()
	{
		
			_MoveCarrot.move ();
		_CarrotCount.carrotnumber += 1;

	}

}

Once again, thank you for the help.

Don’t call .Save() every 5 seconds, and get rid of that loop its what makes it bad… you can just SetInt() and then use GetInt() to fetch value, you don’t need to save it until you unload scene or quit play mode… And why do you have carrot counter script?

void OnGUI() {
	if(GUI.Button(new Rect(xdist, ydis, 85, 40), Advertisement.IsReady() ? "Free Carrots" : "Waiting...")) {
		// Show with default zone, pause engine and print result to debug log
		Advertisement.Show(null, new ShowOptions {
			resultCallback = result => {
				int tmp = PlayerPrefs.GetInt("carrotnumber");
				tmp+=5;
				PlayerPrefs.SetInt("carrotnumber",tmp);
				//Now you could save
				PlayerPrefs.Save();
			}
		});
	}
}

void OnMouseDown ()
{
	_MoveCarrot.move ();
	int tmp = PlayerPrefs.GetInt("carrotnumber");
	tmp+=1;
	PlayerPrefs.SetInt("carrotnumber",tmp);
}